數(shù)據(jù)庫(kù)連接池

一. 早期我們?cè)趺催M(jìn)行數(shù)據(jù)庫(kù)操作

? 1. 原理:一般來(lái)說(shuō)胁黑,java應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的過(guò)程是:

 ????????①裝載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序比驻;

  ????②通過(guò)jdbc建立數(shù)據(jù)庫(kù)連接哮肚;

  ????③訪問(wèn)數(shù)據(jù)庫(kù)凸丸,執(zhí)行sql語(yǔ)句稚茅;

  ????④斷開數(shù)據(jù)庫(kù)連接纸淮。

2. 代碼

3. 分析

????????程序開發(fā)過(guò)程中,存在很多問(wèn)題:首先亚享,每一次web請(qǐng)求都要建立一次數(shù)據(jù)庫(kù)連接咽块。建立連接是一個(gè)費(fèi)時(shí)的活動(dòng),每次都得花費(fèi)0.05s~1s的時(shí)間欺税,而且系統(tǒng)還要分配內(nèi)存資源侈沪,這個(gè)時(shí)間對(duì)于一次或幾次數(shù)據(jù)庫(kù)操作,或許感覺不出系統(tǒng)有多大的開銷晚凿。但對(duì)于現(xiàn)在的web應(yīng)用亭罪,尤其是大型電子商務(wù)網(wǎng)站,同時(shí)有幾百人甚至幾千人在線的情況下歼秽,頻繁的進(jìn)行數(shù)據(jù)庫(kù)連接操作勢(shì)必會(huì)占用很多的系統(tǒng)資源应役,網(wǎng)站的響應(yīng)速度必定下降,嚴(yán)重的甚至?xí)斐煞?wù)器的崩潰。其次箩祥,對(duì)于每一次數(shù)據(jù)庫(kù)連接院崇,使用完后都得斷開,否則當(dāng)程序出現(xiàn)異常而未能關(guān)閉袍祖,將會(huì)導(dǎo)致數(shù)據(jù)庫(kù)系統(tǒng)中的內(nèi)存泄漏底瓣,最終將不得不重啟數(shù)據(jù)庫(kù)。最后蕉陋,這種開發(fā)不能控制被創(chuàng)建的連接對(duì)象數(shù)捐凭,系統(tǒng)資源會(huì)被毫無(wú)顧及的分配出去,如連接過(guò)多凳鬓,也可能導(dǎo)致內(nèi)存泄漏茁肠,服務(wù)器崩潰。

????????通過(guò)上面的分析村视,我們可以看出來(lái),“數(shù)據(jù)庫(kù)連接”是一種稀缺的資源酒奶,為了保障網(wǎng)站的正常使用蚁孔,應(yīng)該對(duì)其進(jìn)行妥善管理。在我們查詢完數(shù)據(jù)庫(kù)后惋嚎,不關(guān)閉連接杠氢,而是暫時(shí)存放起來(lái),當(dāng)別人要進(jìn)行數(shù)據(jù)庫(kù)操作時(shí)另伍,再把這個(gè)連接給他們使用鼻百,就避免了一次建立數(shù)據(jù)庫(kù)連接和斷開操作所帶來(lái)的的消耗。

二. 技術(shù)演進(jìn)出來(lái)的數(shù)據(jù)庫(kù)連接池

????????由上面的分析可以看出摆尝,問(wèn)題的根源就在于對(duì)數(shù)據(jù)庫(kù)連接資源的低效管理温艇。我們知道,對(duì)于共享資源堕汞,有一個(gè)很著名的設(shè)計(jì)模式:資源池(resource pool)勺爱,該模式正是為了解決資源的頻繁分配、釋放所造成的問(wèn)題讯检。為解決上述問(wèn)題琐鲁,可以采用數(shù)據(jù)庫(kù)連接池技術(shù),數(shù)據(jù)庫(kù)連接池的基本思想就是為數(shù)據(jù)庫(kù)連接建立一個(gè)“緩沖池”人灼。預(yù)先在緩沖池中放入一定數(shù)量的連接围段,當(dāng)需要建立數(shù)據(jù)庫(kù)連接時(shí),只需從“緩沖池”中取出一個(gè)投放,使用完畢之后再放回去奈泪。我們可以通過(guò)設(shè)定連接池最大連接數(shù)來(lái)防止系統(tǒng)無(wú)盡的與數(shù)據(jù)庫(kù)連接。更為重要的是我們可以通過(guò)連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫(kù)的連接的數(shù)量、使用情況段磨,為系統(tǒng)開發(fā)取逾、測(cè)試及性能調(diào)整提供依據(jù)。

?我們自己嘗試開發(fā)一個(gè)連接池苹支,來(lái)為上面的查詢業(yè)務(wù)提供數(shù)據(jù)庫(kù)連接服務(wù):

? ???????? ①? 編寫class 實(shí)現(xiàn)DataSource 接口

? ???????? ②? 在class構(gòu)造器一次性創(chuàng)建10個(gè)連接砾隅,將連接保存LinkedList中

? ???????? ③? 實(shí)現(xiàn)getConnection? 從 LinkedList中返回一個(gè)連接

? ???????? ④? 提供將連接放回連接池中方法

1. 連接池代碼

2. 使用連接池重構(gòu)我們的用戶查詢函數(shù)

????????這就是數(shù)據(jù)庫(kù)連接池的原理,它大大提升了數(shù)據(jù)庫(kù)連接的利用率债蜜,減小了內(nèi)存吞吐的開銷晴埂。我們?cè)陂_發(fā)過(guò)程中,就不需要再關(guān)心數(shù)據(jù)庫(kù)連接的問(wèn)題寻定。但連接池需要考慮的問(wè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)鍵字即可確保線程是同步的。使用方法為直接在類方法前面加上synchronized關(guān)鍵字僵芹,如:

? public synchronized connection getconnection()

????建議:

????1处硬、盡量使用tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock)拇派,設(shè)置超時(shí)時(shí)間荷辕,超時(shí)可以退出防止死鎖。

????2件豌、盡量使用java.util.concurrent包的并發(fā)類代替手寫控制并發(fā)疮方,比較常用的是ConcurrentHashMap、ConcurrentLinkedQueue茧彤、AtomicBoolean等等案站,實(shí)際應(yīng)用中java.util.concurrent.atomic十分有用,簡(jiǎn)單方便且效率比使用Lock更高 棘街。

????3蟆盐、盡量不要幾個(gè)功能用同一把鎖 。

????4遭殉、盡量減少同步的代碼塊石挂。

? 2、多數(shù)據(jù)庫(kù)服務(wù)器和多用戶

? ????對(duì)于大型的企業(yè)級(jí)應(yīng)用险污,常常需要同時(shí)連接不同的數(shù)據(jù)庫(kù)(如連接oracle和sybase)痹愚。如何連接不同的數(shù)據(jù)庫(kù)呢富岳?我們采用的策略是:設(shè)計(jì)一個(gè)符合單例模式的連接池管理類,在連接池管理類的唯一實(shí)例被創(chuàng)建時(shí)讀取一個(gè)資源文件拯腮,其中資源文件中存放著多個(gè)數(shù)據(jù)庫(kù)的url地址等信息窖式。根據(jù)資源文件提供的信息,創(chuàng)建多個(gè)連接池類的實(shí)例动壤,每一個(gè)實(shí)例都是一個(gè)特定數(shù)據(jù)庫(kù)的連接池萝喘。連接池管理類實(shí)例為每個(gè)連接池實(shí)例取一個(gè)名字,通過(guò)不同的名字來(lái)管理不同的連接池琼懊。

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

? 3、事務(wù)處理

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

? ???? 在java語(yǔ)言中檬输,connection類本身提供了對(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ù)用度,從而降低建立新連接的開銷关噪,同時(shí)還可以加快用戶的訪問(wèn)速度鸟蟹。

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

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

? ????連接池中到底應(yīng)該放置多少連接海诲,才能使系統(tǒng)的性能最佳繁莹?系統(tǒng)可采取設(shè)置最小連接數(shù)(minconn)和最大連接數(shù)(maxconn)(不能把maxconn設(shè)置的比連接池的默認(rèn)最大值大)來(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)卻慢拍嵌。這樣遭赂,可以在開發(fā)時(shí),設(shè)置較小的最小連接數(shù)横辆,開發(fā)起來(lái)會(huì)快撇他,而在系統(tǒng)實(shí)際使用時(shí)設(shè)置較大的,因?yàn)檫@樣對(duì)訪問(wèn)客戶來(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í)際開發(fā)中有成熟的開源連接池供我們使用

????????理解了連接池的原理就可以了,沒有必要什么都從頭寫一遍蚣抗,那樣會(huì)花費(fèi)很多時(shí)間侈百,并且性能及穩(wěn)定性也不一定滿足要求。事實(shí)上翰铡,已經(jīng)存在很多流行的性能優(yōu)良的第三方數(shù)據(jù)庫(kù)連接池jar包供我們使用钝域。如:

????????????????1.Apache commons-dbcp?連接池:http://commons.apache.org/proper/commons-dbcp/

????????????????2.c3p0?數(shù)據(jù)庫(kù)連接池:http://sourceforge.net/projects/c3p0/

????????網(wǎng)上有很多關(guān)于這些連接池的介紹文章,這里就不再進(jìn)行展開锭魔。

五. 參考文章

https://blog.csdn.net/shuaihj/article/details/14223015

https://www.cnblogs.com/huangchanghuan/articles/8040253.html

http://www.reibang.com/p/a5419af1dea8

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末例证,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迷捧,更是在濱河造成了極大的恐慌织咧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漠秋,死亡現(xiàn)場(chǎng)離奇詭異笙蒙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)庆锦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門捅位,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搂抒,你說(shuō)我怎么就攤上這事艇搀。” “怎么了燕耿?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵中符,是天一觀的道長(zhǎng)姜胖。 經(jīng)常有香客問(wèn)我誉帅,道長(zhǎng),這世上最難降的妖魔是什么右莱? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任蚜锨,我火速辦了婚禮,結(jié)果婚禮上慢蜓,老公的妹妹穿的比我還像新娘亚再。我一直安慰自己,他們只是感情好晨抡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布氛悬。 她就那樣靜靜地躺著则剃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪如捅。 梳的紋絲不亂的頭發(fā)上棍现,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音镜遣,去河邊找鬼己肮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛悲关,可吹牛的內(nèi)容都是我干的谎僻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼寓辱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艘绍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起秫筏,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鞍盗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后跳昼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體般甲,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鹅颊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敷存。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堪伍,死狀恐怖锚烦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帝雇,我是刑警寧澤涮俄,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站尸闸,受9級(jí)特大地震影響彻亲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吮廉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一苞尝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宦芦,春花似錦宙址、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)大咱。三九已至,卻和暖如春注益,著一層夾襖步出監(jiān)牢的瞬間徽级,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工聊浅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留餐抢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓低匙,卻偏偏與公主長(zhǎng)得像旷痕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顽冶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 大家好欺抗,我是IT修真院上海分院第6期學(xué)員,一枚正直善良的JAVA程序員强重。 今天給大家分享一下绞呈,修真院官網(wǎng)JAVA任...
    風(fēng)吹_滿樓閱讀 1,409評(píng)論 0 2
  • 最原始的數(shù)據(jù)庫(kù)連接就是我們打開一個(gè)連接,使用過(guò)后再關(guān)閉該鏈接來(lái)釋放資源间景。頻繁的新建打開再關(guān)閉連接對(duì)jvm和數(shù)據(jù)庫(kù)都...
    野柳閱讀 6,348評(píng)論 1 11
  • 本文摘自:首先鏈接一個(gè)關(guān)于數(shù)據(jù)庫(kù)連接池概念的文檔 璧說(shuō):從數(shù)據(jù)庫(kù)連接池說(shuō)起-博客-云棲社區(qū)-阿里云 首先什么是連接...
    那錢有著落嗎閱讀 940評(píng)論 0 1
  • Map Map 是 ES6 中新增的第二種集合類型的數(shù)據(jù)佃声,用來(lái)存儲(chǔ)鍵值對(duì)。類似于對(duì)象倘要,但是它的屬性也可以是個(gè)對(duì)象 ...
    dptms閱讀 203評(píng)論 0 1
  • 有工作的地方?jīng)]有家圾亏,有家的地方卻沒有工作,他鄉(xiāng)容納不下靈魂封拧,故鄉(xiāng)安置不了肉身志鹃,一個(gè)叫家的地方找不到養(yǎng)家糊口的路,找...
    東閣糖閱讀 1,908評(píng)論 0 1