更新時間:2020-01-19 10:31:46 來源:動力節(jié)點 瀏覽2377次
隨著信息技術(shù)的高速發(fā)展與廣泛應(yīng)用,數(shù)據(jù)庫技術(shù)在信息技術(shù)領(lǐng)域中的位置越來越重要,尤其是網(wǎng)絡(luò)應(yīng)用和電子商務(wù)的迅速發(fā)展,都需要數(shù)據(jù)庫技術(shù)支持動態(tài)Web站點的運行,而傳統(tǒng)的開發(fā)模式是:首先在主程序(如Servlet、Beans)中建立數(shù)據(jù)庫連接;然后進(jìn)行SQL操作,對數(shù)據(jù)庫中的對象進(jìn)行查詢、修改和刪除等操作;最后斷開數(shù)據(jù)庫連接。使用這種開發(fā)模式,對于一個簡單的數(shù)據(jù)庫應(yīng)用,由于數(shù)據(jù)庫的訪問不是很頻繁,只需要在訪問數(shù)據(jù)庫時創(chuàng)建一個連接,用完后就關(guān)閉它,這樣做不會明顯的增大系統(tǒng)的開銷。但是對于一個復(fù)雜的數(shù)據(jù)庫應(yīng)用,情況就完全不同:頻繁的建立、關(guān)閉數(shù)據(jù)庫,會極大的降低系統(tǒng)的性能,增大系統(tǒng)的開銷,甚至成為系統(tǒng)的瓶頸。另外使用這種傳統(tǒng)的模式,還必須管理數(shù)據(jù)庫的每一個連接,以確保他們能正確關(guān)閉,如果出現(xiàn)程序異常而導(dǎo)致某些連接未能關(guān)閉,將引起數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄露,最終不得不重啟數(shù)據(jù)庫。因此采用運行速度更快、數(shù)據(jù)庫訪問效率更高的數(shù)據(jù)庫技術(shù),以提高系統(tǒng)的運行效率將是至關(guān)重要的。
為了解決這一問題,在JDBC2.0中提出了JDBC連接池技術(shù),通過在客戶之間共享一組連接,而不是在它們需要的時候再為它們生成,這樣就可以改善資源使用,提高應(yīng)用程序的響應(yīng)能力。
JDBC概述
JDBC(JavaDatabaseConnectivity,Java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的JavaAPI,可以為多種關(guān)系型數(shù)據(jù)庫(如Oracle、Sybase、SQLServer、Access等)提供統(tǒng)一訪問接口,它由一組Java語言編寫的類和接口組成,使數(shù)據(jù)庫開發(fā)人員能夠用標(biāo)準(zhǔn)JavaAPI編寫數(shù)據(jù)庫應(yīng)用程序。
連接池技術(shù)
1、連接池原理
連接池技術(shù)的核心思想是:連接復(fù)用,通過建立一個數(shù)據(jù)庫連接池以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫連接頻繁建立、關(guān)閉的開銷。另外,由于對JDBC中的原始連接進(jìn)行了封裝,從而方便了數(shù)據(jù)庫應(yīng)用對于連接的使用(特別是對于事務(wù)處理),提高了開發(fā)
效率,也正是因為這個封裝層的存在,隔離了應(yīng)用的本身的處理邏輯和具體數(shù)據(jù)庫訪問邏輯,使應(yīng)用本身的復(fù)用成為可能。連接池主要由三部分組成(如圖1所示):連接池的建立、連接池中連接的使用管理、連接池的關(guān)閉。下面就著重討論這三部分及連接池的配置問題。
1.1連接池的建立
應(yīng)用程序中建立的連接池其實是一個靜態(tài)的。所謂靜態(tài)連接池是指連接池中的連接在系統(tǒng)初始化時就已分配好,且不能隨意關(guān)閉連接。Java中提供了很多容器類可以方便的構(gòu)建連接池,如:Vector、Stack、Servlet、Bean等,通過讀取連接屬性文件Connections.properties與數(shù)據(jù)庫實例建立連接。在系統(tǒng)初始化時,根據(jù)相應(yīng)的配置創(chuàng)建連接并放置在連接池中,以便需要使用時能從連接池中獲取,這樣就可以避免連接隨意的建立、關(guān)閉造成的開銷。
1.2連接池的管理
連接池管理策略是連接池機制的核心。當(dāng)連接池建立后,如何對連接池中的連接進(jìn)行管理,解決好連接池內(nèi)連接的分配和釋放,對系統(tǒng)的性能有很大的影響。連接的合理分配、釋放可提高連接的復(fù)用,降低了系統(tǒng)建立新連接的開銷,同時也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。
連接池的分配、釋放策略對于有效復(fù)用連接非常重要,我們采用的方法是一個很有名的設(shè)計模式:
ReferenceCounting(引用記數(shù))。該模式在復(fù)用資源方面應(yīng)用的非常廣泛,把該方法運用到對于連接的分配釋放上,為每一個數(shù)據(jù)庫連接,保留一個引用記數(shù),用來記錄該連接的使用者的個數(shù)。具體的實現(xiàn)方法是:
當(dāng)客戶請求數(shù)據(jù)庫連接時,首先查看連接池中是否有空閑連接(指當(dāng)前沒有分配出去的連接)。如果存在空閑連接,則把連接分配給客戶并作相應(yīng)處理(即標(biāo)記該連接為正在使用,引用計數(shù)加1)。如果沒有空閑連接,則查看當(dāng)前所開的連接數(shù)是不是已經(jīng)達(dá)到maxConn(最大連接數(shù)),如果沒達(dá)到就重新創(chuàng)建一個連接給請求的客戶;如果達(dá)到就按設(shè)定的maxWaitTime(最大等待時間)進(jìn)行等待,如果等待maxWaitTime后仍沒有空閑連接,就拋出無空閑連接的異常給用戶。
當(dāng)客戶釋放數(shù)據(jù)庫連接時,先判斷該連接的引用次數(shù)是否超過了規(guī)定值,如果超過就刪除該連接,并判斷當(dāng)前連接池內(nèi)總的連接數(shù)是否小于minConn(最小連接數(shù)),若小于就將連接池充滿;如果沒超過就將該連接標(biāo)記為開放狀態(tài),可供再次復(fù)用。可以看出正是這套策略保證了數(shù)據(jù)庫連接的有效復(fù)用,避免頻繁地建立、釋放連接所帶來的系統(tǒng)資源開銷。
1.3連接池的關(guān)閉
當(dāng)應(yīng)用程序退出時,應(yīng)關(guān)閉連接池,此時應(yīng)把在連接池建立時向數(shù)據(jù)庫申請的連接對象統(tǒng)一歸還給數(shù)據(jù)庫(即關(guān)閉所有數(shù)據(jù)庫連接),這與連接池的建立正好是一個相反過程。
1.4連接池的配置
數(shù)據(jù)庫連接池中到底要放置多少個連接,才能使系統(tǒng)的性能更佳,用minConn和maxConn來限制。minConn是當(dāng)應(yīng)用啟動的時候連接池所創(chuàng)建的連接數(shù),如果過大啟動將變慢,但是啟動后響應(yīng)更快;如果過小啟動加快,但是最初使用的用戶將因為連接池中沒有足夠的連接不可避免的延緩了執(zhí)行速度。因此應(yīng)該在開發(fā)的過程中設(shè)定較小minConn,而在實際應(yīng)用的中設(shè)定較大minConn。maxConn是連接池中的最大連接數(shù),可以通過反復(fù)試驗來確定此飽和點。為此在連接池類ConnectionPool中加入兩個方法getActiveSize()和getOpenSize(),ActiveSize表示某一時間有多少連接正被使用,OpenSize表示連接池中有多少連接被打開,反映了連接池使用的峰值。將這兩個值在日志信息中反應(yīng)出來,minConn的值應(yīng)該小于平均ActiveSize,而maxConn的值應(yīng)該在activeSize和OpenSize之間。
2、連接池的關(guān)鍵技術(shù)
2.1事務(wù)處理
前面討論的是關(guān)于使用數(shù)據(jù)庫連接進(jìn)行普通的數(shù)據(jù)庫訪問。對于事務(wù)處理,情況就變得比較復(fù)雜。因為事務(wù)本身要求原則性的保證,此時就要求對于數(shù)據(jù)庫的操作符合"All-All-Nothing"原則,即要么全部完成,要么什么都不做。如果簡單的采用上述的連接復(fù)用的策略,就會發(fā)生問題,因為沒有辦法控制屬于同一個事務(wù)的多個數(shù)據(jù)庫操作方法的動作,可能這些數(shù)據(jù)庫操作是在多個連接上進(jìn)行的,并且這些連接可能被其他非事務(wù)方法復(fù)用。Connection本身具有提供了對于事務(wù)的支持,可以通過設(shè)置Connection的AutoCommit屬性為false,顯式的調(diào)用commit或rollback方法來實現(xiàn)。但是要安全、高效的進(jìn)行連接復(fù)用,就必須提供相應(yīng)的事務(wù)支持機制。方法是:采用顯式的事務(wù)支撐方法,每一個事務(wù)獨占一個連接。這種方法可以大大降低對于事務(wù)處理的復(fù)雜性,并且又不會妨礙連接的復(fù)用。
連接管理服務(wù)提供了顯式的事務(wù)開始、結(jié)束(commit或rollback)聲明,以及一個事務(wù)注冊表,用于登記事務(wù)發(fā)起者和事務(wù)使用的連接的對應(yīng)關(guān)系,通過該表,使用事務(wù)的部分和連接管理部分就隔離開,因為該表是在運行時根據(jù)實際的調(diào)用情況動態(tài)生成的。事務(wù)使用的連接在該事務(wù)運行中不能被復(fù)用。在實現(xiàn)中,用戶標(biāo)識是通過使用者所在的線程來標(biāo)識的。后面的所有對于數(shù)據(jù)庫的訪問都是通過查找該注冊表,使用已經(jīng)分配的連接來完成的。當(dāng)事務(wù)結(jié)束時,從注冊表中刪除相應(yīng)表項。
2.2封裝
從上面的論述可以看出,普通的數(shù)據(jù)庫方法和事務(wù)方法對于連接的使用(分配、釋放)是不同的,為了便于使用,對外提供一致的操作接口,我們對連接進(jìn)行了封裝:普通連接和事務(wù)連接,并利用了Java中的強大的面向?qū)ο筇匦裕憾鄳B(tài)。普通連接和事務(wù)連接均實現(xiàn)了一個DbConnection接口,對于接口中定義的方法,分別根據(jù)自己的特點作了不同的實現(xiàn),這樣在對于連接的處理上就非常的一致了。
2.3并發(fā)
為了使連接管理服務(wù)有更大的通用性,我們必須要考慮到多線程環(huán)境,即并發(fā)問題。在一個多線程的環(huán)境下,必須要保證連接管理自身數(shù)據(jù)的一致性和連接內(nèi)部數(shù)據(jù)的一致性,在這方面Java提供很好的支持(synchronized關(guān)鍵字),這樣就很容易使連接管理成為線程安全的。
2.4多數(shù)據(jù)庫服務(wù)器
在實際應(yīng)用中,應(yīng)用程序常常需要訪問多個不同的數(shù)據(jù)庫。如何通過同一個連接池訪問不同的數(shù)據(jù)庫,是應(yīng)用程序需要解決的一個核心問題。下面介紹一種解決的途徑:
首先,定義一個數(shù)據(jù)庫連接池參數(shù)的類,定義了數(shù)據(jù)庫的JDBC驅(qū)動程序類名,連接的URL以及用戶名口令等等一些信息,該類是用于初始化連接池的參數(shù):
publicclassConnectionParamimplementsSerializable{
//各初始化參數(shù)的定義
}
其次是連接池的工廠類ConnectionFactory,通過該類將一個連接池對象與一個名稱對應(yīng)起來,使用者通過該名稱就可以獲取指定的連接池對象,實現(xiàn)的主要代碼如下:
publicclassConnectionFactory{
staticHashtableconnectionPools=//用來保存數(shù)據(jù)源名和連接池對象的關(guān)系
publicstaticDataSourcelookup(StringdataSourceName)throws
NameNotFoundException{
//查找名字為dataSourceName的數(shù)據(jù)源
}
publicstaticDataSourcebind(Stringname,ConnectionParamparam)
throwsException
//將名字name與使用param初始化的連接池對象綁定
}
publicstaticvoidunbind(Stringname)throwsNameNotFound
Exception{
//將與名字name綁定的連接池對象刪除
}
連接池應(yīng)用的實現(xiàn)
一個完整的連接池應(yīng)用包括三個部分:DBConnectionPool類,負(fù)責(zé)從連接池獲取(或創(chuàng)建)連接、將連接返回給連接池、系統(tǒng)關(guān)閉時關(guān)閉所有連接釋放所有資源;DBConnectionManager類,負(fù)責(zé)裝載和注冊JDBC驅(qū)動、根據(jù)屬性文件中定義的屬性創(chuàng)建DBConnectionPool、跟蹤應(yīng)用程序?qū)B接池的引用等;應(yīng)用程序?qū)B接池的使用。
本文實現(xiàn)的數(shù)據(jù)庫連接池包括一個管理類DBConnectionManager,負(fù)責(zé)提供與多個連接池對象(DBConnectionPool類)之間的接口。每一個連接池對象管理一組封裝過的JDBC連接對象Conn,封裝過的JDBC連接對象Conn可以被任意數(shù)量的Model層的組件共享。
類Conn的設(shè)計很簡單,如下所示:
ClassConn{
Privatejava.sgl.Connectioncon;//數(shù)據(jù)庫連接對象
PublicBooleaninUse;//是否被使用
PubliclonglastAccess;//最近一次釋放該連接的時間
PublicintuseCount;//被使用次數(shù)
}
下面是實現(xiàn)連接池的主要代碼:
//初始化數(shù)據(jù)庫連接池
publicstaticsynchronizedvoidFastInitPool()
throwsException{
try{Class.forName(driver);
for(inti=0;i
Connectioncon=createConnection();
if(con!=null)addConnection(con);
}}}
//向連接池對象中添加數(shù)據(jù)庫連接
privatestaticvoidaddConnection(Connectioncon){
if(pool=null||pool1=null){
pool=newVector(size);
pool1=newVector(size);}
pool.addElement(con);
pool1.addElement("false");}
//獲取數(shù)據(jù)庫連接
publicstaticsynchronizedConnectiongetConn()
throwsException{
Connectionconn=null;
try{if(driver=null)
FastInitPool();
//獲得一個可用的(空閑的)連接
.for(inti=0;i<pool.size();i++){
conn=(Connection)pool.elementAt(i);
if(pool1.elementAt(i)=="false"){
pool1.set(i,"true");
//System.out.println("從連接池中獲取第"+(i+1)+"個空閑連接");
returnconn;
}
}
//如果沒有可用連接,且已有連接數(shù)小于最大連接數(shù)限制,則創(chuàng)建并增加一個新連接到連接池
conn=createConnection();
pool.addElement(conn);
pool1.addElement("true");
//System.out.println("所有連接都在使用,在連接池中再創(chuàng)建一個新連接");
}
catch(Exceptione){
System.err.println(e.getMessage());
thrownewException(e.getMessage());
}
returnconn;//返回一個有效的新連接
}
publicConnectiongetConnection(StringstrDriver,StringstrUrl,StringstrUserName,String
strPassWord)
throwsSQLException{
try{
Class.forName(strDriver);
conn=DriverManager.getConnection(strUrl,strUserName,strPassWord);}
returnconn;
}
結(jié)束語
當(dāng)前Web應(yīng)用程序廣泛采用B/S結(jié)構(gòu),其并發(fā)性決定了多用戶同時訪問數(shù)據(jù)庫的問題。本文闡述的基于JDBC的數(shù)據(jù)庫連接池技術(shù)已成功應(yīng)用于基于Web的高職教學(xué)系統(tǒng)開發(fā)中,并建立了數(shù)據(jù)庫連接池實例來說明和證實連接池的訪問方法。只有充分運用連接池訪問技術(shù),才能提高數(shù)據(jù)庫的訪問效率,改善Web應(yīng)用,從而減少系統(tǒng)開銷,大大提高整個Web應(yīng)用系統(tǒng)的運行效率。
數(shù)據(jù)庫相關(guān)視頻教程
oracle數(shù)據(jù)庫教程:http://m.dabaquan.cn/v22/
數(shù)據(jù)庫plsql教程:http://m.dabaquan.cn/v23/
jdbc數(shù)據(jù)庫教程:http://m.dabaquan.cn/v24/
數(shù)據(jù)庫mysql教程:http://m.dabaquan.cn/v21
Java實戰(zhàn)項目視頻之egov項目視頻教程【免費下載】:http://m.dabaquan.cn/v83/
Java學(xué)生成績管理系統(tǒng)視頻教程【免費下載】:http://m.dabaquan.cn/v51/
以上就是動力節(jié)點Java培訓(xùn)機構(gòu)小編介紹的“Java數(shù)據(jù)庫免費視頻-連接池的工作原理”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)內(nèi)容
Java編程學(xué)習(xí):MySQL數(shù)據(jù)庫的學(xué)習(xí)路線
Java數(shù)據(jù)庫入門學(xué)習(xí),mysql書籍推薦
學(xué)習(xí)Java數(shù)據(jù)庫增刪查改通用方法
Java學(xué)習(xí):數(shù)據(jù)庫學(xué)習(xí)條件查詢和排序
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743