连接池,数据库连接池
連接池
連接池是什么?
連接池是創(chuàng)建和管理一個(gè)連接的緩沖池的技術(shù),這些連接準(zhǔn)備好被任何需要它們的線程使用。
連接池的優(yōu)點(diǎn)
- 減少連接創(chuàng)建時(shí)間
- 簡(jiǎn)化的編程模式
- 受控的資源使用
注:連接池能夠使性能最大化,同時(shí)還能將資源利用控制在一定的水平之下,如果超過(guò)該水平,應(yīng)用程序?qū)⒈罎⒍粌H僅是變慢。
在實(shí)際應(yīng)用開(kāi)發(fā)中,特別是在WEB應(yīng)用系統(tǒng)中,如果JSP、Servlet或EJB使用JDBC直接訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),每一次數(shù)據(jù)訪問(wèn)請(qǐng)求都必須經(jīng)歷建立數(shù)據(jù)庫(kù)連接、打開(kāi)數(shù)據(jù)庫(kù)、存取數(shù)據(jù)和關(guān)閉數(shù)據(jù)庫(kù)連接等步驟,而連接并打開(kāi)數(shù)據(jù)庫(kù)是一件既消耗資源又費(fèi)時(shí)的工作,如果頻繁發(fā)生這種數(shù)據(jù)庫(kù)操作,系統(tǒng)的性能必然會(huì)急劇下降,甚至?xí)?dǎo)致系統(tǒng)崩潰。數(shù)據(jù)庫(kù)連接池技術(shù)是解決這個(gè)問(wèn)題最常用的方法,在許多應(yīng)用程序服務(wù)器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了這項(xiàng)技術(shù),無(wú)需自己編程,但是,深入了解這項(xiàng)技術(shù)是非常必要的。
數(shù)據(jù)庫(kù)連接池技術(shù)的思想非常簡(jiǎn)單,將數(shù)據(jù)庫(kù)連接作為對(duì)象存儲(chǔ)在一個(gè)Vector對(duì)象中,一旦數(shù)據(jù)庫(kù)連接建立后,不同的數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求就可以共享這些連接,這樣,通過(guò)復(fù)用這些已經(jīng)建立的數(shù)據(jù)庫(kù)連接,可以克服上述缺點(diǎn),極大地節(jié)省系統(tǒng)資源和時(shí)間。
數(shù)據(jù)庫(kù)連接池的運(yùn)行原理
數(shù)據(jù)庫(kù)連接池的主要操作如下:
(1)建立數(shù)據(jù)庫(kù)連接池對(duì)象(服務(wù)器啟動(dòng))。
(2)按照事先指定的參數(shù)創(chuàng)建初始數(shù)量的數(shù)據(jù)庫(kù)連接(即:空閑連接數(shù))。
(3)對(duì)于一個(gè)數(shù)據(jù)庫(kù)訪問(wèn)請(qǐng)求,直接從連接池中得到一個(gè)連接。如果數(shù)據(jù)庫(kù)連接池對(duì)象中沒(méi)有空閑的連接,且連接數(shù)沒(méi)有達(dá)到最大(即:最大活躍連接數(shù)),創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)連接。
(4)存取數(shù)據(jù)庫(kù)。
(5)關(guān)閉數(shù)據(jù)庫(kù),釋放所有數(shù)據(jù)庫(kù)連接(此時(shí)的關(guān)閉數(shù)據(jù)庫(kù)連接,并非真正關(guān)閉,而是將其放入空閑隊(duì)列中。如實(shí)際空閑連接數(shù)大于初始空閑連接數(shù)則釋放連接)。
(6)釋放數(shù)據(jù)庫(kù)連接池對(duì)象(服務(wù)器停止、維護(hù)期間,釋放數(shù)據(jù)庫(kù)連接池對(duì)象,并釋放所有連接)。
簡(jiǎn)單來(lái)說(shuō):
連接池的工作原理主要由三部分組成,分別為
連接池的實(shí)現(xiàn)模式
連接池需要注意的點(diǎn)
1、并發(fā)問(wèn)題
為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問(wèn)題。這個(gè)問(wèn)題相對(duì)比較好解決,因?yàn)楦鱾€(gè)語(yǔ)言自身提供了對(duì)并發(fā)管理的支持像java,c#等等,使用synchronized(java)lock(C#)關(guān)鍵字即可確保線程是同步的。使用方法可以參考,相關(guān)文獻(xiàn)。
2、事務(wù)處理
我們知道,事務(wù)具有原子性,此時(shí)要求對(duì)數(shù)據(jù)庫(kù)的操作符合“ALL-OR-NOTHING”原則,即對(duì)于一組SQL語(yǔ)句要么全做,要么全不做。
我們知道當(dāng)2個(gè)線程共用一個(gè)連接Connection對(duì)象,而且各自都有自己的事務(wù)要處理時(shí)候,對(duì)于連接池是一個(gè)很頭疼的問(wèn)題,因?yàn)榧词笴onnection類提供了相應(yīng)的事務(wù)支持,可是我們?nèi)匀徊荒艽_定那個(gè)數(shù)據(jù)庫(kù)操作是對(duì)應(yīng)那個(gè)事務(wù)的,這是由于我們有2個(gè)線程都在進(jìn)行事務(wù)操作而引起的。為此我們可以使用每一個(gè)事務(wù)獨(dú)占一個(gè)連接來(lái)實(shí)現(xiàn),雖然這種方法有點(diǎn)浪費(fèi)連接池資源但是可以大大降低事務(wù)管理的復(fù)雜性。
3、連接池的分配與釋放
連接池的分配與釋放,對(duì)系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開(kāi)銷,同時(shí)還可以加快用戶的訪問(wèn)速度。
對(duì)于連接的管理可使用一個(gè)List。即把已經(jīng)創(chuàng)建的連接都放入List中去統(tǒng)一管理。每當(dāng)用戶請(qǐng)求一個(gè)連接時(shí),系統(tǒng)檢查這個(gè)List中有沒(méi)有可以分配的連接。如果有就把那個(gè)最合適的連接分配給他(如何能找到最合適的連接文章將在關(guān)鍵議題中指出);如果沒(méi)有就拋出一個(gè)異常給用戶,List中連接是否可以被分配由一個(gè)線程來(lái)專門(mén)管理捎后我會(huì)介紹這個(gè)線程的具體實(shí)現(xiàn)。
4、連接池的配置與維護(hù)
連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設(shè)置最小連接數(shù)(minConnection)和最大連接數(shù)(maxConnection)等參數(shù)來(lái)控制連接池中的連接。比方說(shuō),最小連接數(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)客戶來(lái)說(shuō)速度會(huì)快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問(wèn)量,可通過(guò)軟件需求上得到。
如何確保連接池中的最小連接數(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í)再去檢查。
參考:https://www.cnblogs.com/whb11/p/11315463.html
總結(jié)
以上是生活随笔為你收集整理的连接池,数据库连接池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Cannot resolve xxx.5
- 下一篇: Maven中 jar包冲突原理与解决办法