新聞中心

EEPW首頁(yè) > EDA/PCB > 設(shè)計(jì)應(yīng)用 > 基于JDBC的數(shù)據(jù)庫(kù)連接池技術(shù)研究與應(yīng)用

基于JDBC的數(shù)據(jù)庫(kù)連接池技術(shù)研究與應(yīng)用

作者: 時(shí)間:2012-09-18 來(lái)源:網(wǎng)絡(luò) 收藏

2、服務(wù)器自帶的連接池

的API中沒(méi)有提供連接池的方法。一些大型的WEB應(yīng)用服務(wù)器如BEA的WebLogic和IBM的WebSphere等提供了連接池的機(jī)制,但是必須有其第三方的專(zhuān)用類(lèi)方法支持連接池的用法。

連接池關(guān)鍵問(wèn)題分析

1、并發(fā)問(wèn)題

為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問(wèn)題。這個(gè)問(wèn)題相對(duì)比較好解決,因?yàn)镴ava語(yǔ)言自身提供了對(duì)并發(fā)管理的支持,使用synchronized關(guān)鍵字即可確保線程是同步的。使用方法為直接在類(lèi)方法前面加上synchronized關(guān)鍵字,如:

public synchronized Connection getConnection()

2、多服務(wù)器和多用戶(hù)

對(duì)于大型的企業(yè)級(jí)應(yīng)用,常常需要同時(shí)連接不同的(如連接Oracle和Sybase)。如何連接不同的呢?我們采用的策略是:設(shè)計(jì)一個(gè)符合單例模式的連接池管理類(lèi),在連接池管理類(lèi)的唯一實(shí)例被創(chuàng)建時(shí)讀取一個(gè)資源文件,其中資源文件中存放著多個(gè)數(shù)據(jù)庫(kù)的url地址()?用戶(hù)名()?密碼()等信息。如tx.url=172.21.15.123:5000/tx_it,tx.user=yang,tx.password=yang321。根據(jù)資源文件提供的信息,創(chuàng)建多個(gè)連接池類(lèi)的實(shí)例,每一個(gè)實(shí)例都是一個(gè)特定數(shù)據(jù)庫(kù)的連接池。連接池管理類(lèi)實(shí)例為每個(gè)連接池實(shí)例取一個(gè)名字,通過(guò)不同的名字來(lái)管理不同的連接池。

對(duì)于同一個(gè)數(shù)據(jù)庫(kù)有多個(gè)用戶(hù)使用不同的名稱(chēng)和密碼訪問(wèn)的情況,也可以通過(guò)資源文件處理,即在資源文件中設(shè)置多個(gè)具有相同url地址,但具有不同用戶(hù)名和密碼的數(shù)據(jù)庫(kù)連接信息。

3、事務(wù)處理

我們知道,事務(wù)具有原子性,此時(shí)要求對(duì)數(shù)據(jù)庫(kù)的操作符合“ALL-ALL-NOTHING”原則,即對(duì)于一組SQL語(yǔ)句要么全做,要么全不做。

在Java語(yǔ)言中,Connection類(lèi)本身提供了對(duì)事務(wù)的支持,可以通過(guò)設(shè)置Connection的AutoCommit屬性為false,然后顯式的調(diào)用commit或rollback方法來(lái)實(shí)現(xiàn)。但要高效的進(jìn)行Connection復(fù)用,就必須提供相應(yīng)的事務(wù)支持機(jī)制。可采用每一個(gè)事務(wù)獨(dú)占一個(gè)連接來(lái)實(shí)現(xiàn),這種方法可以大大降低事務(wù)管理的復(fù)雜性。

4、連接池的分配與釋放

連接池的分配與釋放,對(duì)系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開(kāi)銷(xiāo),同時(shí)還可以加快用戶(hù)的訪問(wèn)速度。

對(duì)于連接的管理可使用空閑池。即把已經(jīng)創(chuàng)建但尚未分配出去的連接按創(chuàng)建時(shí)間存放到一個(gè)空閑池中。每當(dāng)用戶(hù)請(qǐng)求一個(gè)連接時(shí),系統(tǒng)首先檢查空閑池內(nèi)有沒(méi)有空閑連接。如果有就把建立時(shí)間最長(zhǎng)(通過(guò)容器的順序存放實(shí)現(xiàn))的那個(gè)連接分配給他(實(shí)際是先做連接是否有效的判斷,如果可用就分配給用戶(hù),如不可用就把這個(gè)連接從空閑池刪掉,重新檢測(cè)空閑池是否還有連接);如果沒(méi)有則檢查當(dāng)前所開(kāi)連接池是否達(dá)到連接池所允許的最大連接數(shù)(maxConn),如果沒(méi)有達(dá)到,就新建一個(gè)連接,如果已經(jīng)達(dá)到,就等待一定的時(shí)間(timeout)。如果在等待的時(shí)間內(nèi)有連接被釋放出來(lái)就可以把這個(gè)連接分配給等待的用戶(hù),如果等待時(shí)間超過(guò)預(yù)定時(shí)間timeout,則返回空值(null)。系統(tǒng)對(duì)已經(jīng)分配出去正在使用的連接只做計(jì)數(shù),當(dāng)使用完后再返還給空閑池。對(duì)于空閑連接的狀態(tài),可開(kāi)辟專(zhuān)門(mén)的線程定時(shí)檢測(cè),這樣會(huì)花費(fèi)一定的系統(tǒng)開(kāi)銷(xiāo),但可以保證較快的響應(yīng)速度。也可采取不開(kāi)辟專(zhuān)門(mén)線程,只是在分配前檢測(cè)的方法。

5、連接池的配置與維護(hù)

連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設(shè)置最小連接數(shù)(minConn)和最大連接數(shù)(maxConn)來(lái)控制連接池中的連接。最小連接數(shù)是系統(tǒng)啟動(dòng)時(shí)連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過(guò)多,則系統(tǒng)啟動(dòng)就慢,但創(chuàng)建后系統(tǒng)的響應(yīng)速度會(huì)很快;如果創(chuàng)建過(guò)少,則系統(tǒng)啟動(dòng)的很快,響應(yīng)起來(lái)卻慢。這樣,可以在開(kāi)發(fā)時(shí),設(shè)置較小的最小連接數(shù),開(kāi)發(fā)起來(lái)會(huì)快,而在系統(tǒng)實(shí)際使用時(shí)設(shè)置較大的,因?yàn)檫@樣對(duì)訪問(wèn)客戶(hù)來(lái)說(shuō)速度會(huì)快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問(wèn)量,可通過(guò)反復(fù)測(cè)試,找到最佳點(diǎn)。

如何確保連接池中的最小連接數(shù)呢?有動(dòng)態(tài)和靜態(tài)兩種策略。動(dòng)態(tài)即每隔一定時(shí)間就對(duì)連接池進(jìn)行檢測(cè),如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補(bǔ)充相應(yīng)數(shù)量的新連接,以保證連接池的正常運(yùn)轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時(shí)再去檢查。

連接池的實(shí)現(xiàn)



評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉