数据库连接池的工作原理
對(duì)于共享資源,有一個(gè)很著名的設(shè)計(jì)模式:資源池(resource pool)。該模式正是為解決資源頻繁分配、釋放所造成的問(wèn)題。數(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)開(kāi)發(fā),測(cè)試以及性能調(diào)整提供依據(jù)。
連接池的相關(guān)問(wèn)題分析:
1、并發(fā)問(wèn)題。
為了使連接管理服務(wù)具有最大的通用性,必須考慮多線(xiàn)程環(huán)境,并發(fā)問(wèn)題。這個(gè)問(wèn)題相對(duì)比較好解決,因?yàn)楦鱾€(gè)語(yǔ)言自身提供了并發(fā)管理的支持,比如java c#等,使用synchronized(java) ?lock(c#)等關(guān)鍵字確保線(xiàn)程同步。
2、事務(wù)管理。
我們知道,事務(wù)具有原子性,此時(shí)要求對(duì)數(shù)據(jù)庫(kù)操作符合“ALL-ALL- NOTHING”原則,即對(duì)于一組sql語(yǔ)句要么全做,要么全不做。我們知道當(dāng)兩個(gè)線(xiàn)程共用一個(gè)連接connection對(duì)象時(shí),而且各自都有自己的事務(wù) 要處理時(shí),對(duì)于連接池是一個(gè)很頭疼的問(wèn)題,因?yàn)榧词筩onnection類(lèi)提供了相應(yīng)的事務(wù)支持,可是我們?nèi)匀徊荒艽_定那個(gè)數(shù)據(jù)庫(kù)操作對(duì)應(yīng)那個(gè)事務(wù)。知識(shí) 由于我們的兩個(gè)線(xiàn)程都在進(jìn)行事務(wù)操作。為此我們可以使用每一個(gè)事物獨(dú)占一個(gè)連接來(lái)實(shí)現(xiàn),雖然這種方法有點(diǎn)浪費(fèi)連接池資源但是可以大大降低事務(wù)管理的復(fù)雜 性。
3、連接池的分配與釋放
連接池的分配與釋放,對(duì)系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開(kāi)銷(xiāo),同時(shí)還可以加快用戶(hù)的訪(fǎng)問(wèn)速度。
對(duì)于連接的管理可使用一個(gè)List。即把已經(jīng)創(chuàng)建的連接都放入List中去統(tǒng)一管理。每當(dāng)用戶(hù)請(qǐng)求一個(gè)連接時(shí),系統(tǒng)檢查這個(gè)List中有沒(méi)有可以分配的 連接。如果有就把那個(gè)最合適的連接分配給他(如何能找到最合適的連接文章將在關(guān)鍵議題中指出);如果沒(méi)有就拋出一個(gè)異常給用戶(hù),List中連接是否可以被 分配由一個(gè)線(xiàn)程來(lái)專(zhuān)門(mén)管理捎后我會(huì)介紹這個(gè)線(xiàn)程的具體實(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ì)訪(fǎng)問(wèn)客戶(hù)來(lái)說(shuō)速度會(huì)快些。最大連接數(shù)是連接池中允許 連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪(fǎ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í)再去檢查。
?
引用記數(shù)
在分配、釋放策略對(duì)于有效復(fù)用連接非常重要,我們 采用的方法也是采用了一個(gè)很有名的設(shè)計(jì)模式:reference counting(引用記數(shù))。該模式在復(fù)用資源方面使用非常廣泛,我們把該方法運(yùn)用到對(duì)于連接分配釋放上。每一個(gè)數(shù)據(jù)庫(kù)連接,保留一個(gè)引用記數(shù),用來(lái)記 錄該鏈接的使用者的個(gè)數(shù)。具體實(shí)現(xiàn)上,我們對(duì)connection類(lèi)進(jìn)行了進(jìn)一步包裝來(lái)實(shí)現(xiàn)引用記數(shù)。被包裝的connection類(lèi)我們提供2個(gè)方法來(lái) 實(shí)現(xiàn)引用記數(shù)的操作,一個(gè)是repeat(被分配出去)一個(gè)是remove(被釋放回來(lái));然后利用repeatnow屬性來(lái)確定當(dāng)前引用多少,具體是哪 個(gè)用戶(hù)引用了該連接,將在連接池中登記;最后提供isRepeat屬性來(lái)確定該連接是否可以使用引用記數(shù)技術(shù)。一旦一個(gè)連接被分配出去,那么就會(huì)對(duì)該連接 的申請(qǐng)者進(jìn)行登記,并且增加引用記數(shù),當(dāng)被釋放回來(lái)時(shí)就刪除他登記的信息,同時(shí)減少一次引用記數(shù)。這樣做的一個(gè)很大的好處是,使得我們可以高效的使用連 接,因?yàn)橐坏┧羞B接都被分配出去,我們就可以根據(jù)相應(yīng)的策略從使用池中挑出一個(gè)正在使用的連接來(lái)復(fù)用,而不是隨便拿出一個(gè)連接去復(fù)用。
?
?
? ? ? ? 連接池用于創(chuàng)建和管理數(shù)據(jù)庫(kù)連接的緩沖技術(shù),緩沖池中的連接可以被任何需要他們的線(xiàn)程使用。當(dāng)一個(gè)線(xiàn)程需要使用JDBC對(duì)一個(gè)數(shù)據(jù)庫(kù)操作時(shí),將從池中請(qǐng)求一個(gè)連接。當(dāng)這個(gè)鏈接使用完畢后,將返回連接池中,等待為其他的線(xiàn)程服務(wù)。
連接池的主要優(yōu)點(diǎn):
1)減少連接的創(chuàng)建時(shí)間,連接池中的連接是已準(zhǔn)備好的,可以重復(fù)使用的,獲取后可以直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),因此減少了連接創(chuàng)建的次數(shù)和時(shí)間。
2)簡(jiǎn)化的編程模式。當(dāng)使用連接池時(shí),每一個(gè)單獨(dú)的線(xiàn)程能夠像創(chuàng)建自己的JDBC連接一樣操作,允許用戶(hù)直接使用 JDBC編程技術(shù)。
3)控制資源的使用。如果不使用連接池,每次訪(fǎng)問(wèn)數(shù)據(jù) 庫(kù)都需要?jiǎng)?chuàng)建一個(gè)連接,這樣系統(tǒng)的穩(wěn)定性受系統(tǒng)的連接需求影響很大,很容易產(chǎn)生資源浪費(fèi)和高負(fù)載異常。連接池能夠使性能最大化,將資源利用控制在一定的水 平之下。連接池能控制池中的鏈接數(shù)量,增強(qiáng)了系統(tǒng)在大量用戶(hù)應(yīng)用時(shí)的穩(wěn)定性。
連接池的工作原理:
連接池的核心思想是連接的復(fù)用,通過(guò)建立一個(gè)數(shù)據(jù)庫(kù)連接池以及一套連接使用、分配和管理策略,使得該連接池中的連接可以得到高效,安全的復(fù)用,避免了數(shù)據(jù)庫(kù)連接頻繁建立和關(guān)閉的開(kāi)銷(xiāo)。
連接池的工作原理主要由三部分組成,分別為連接池的建立,連接池中連接的使用管理,連接池的關(guān)閉。
第一、連接池的建立。一般在系統(tǒng)初始化時(shí),連接池會(huì)根 據(jù)系統(tǒng)配置建立,并在池中建立幾個(gè)連接對(duì)象,以便使用時(shí)能從連接池中獲取,連接池中的連接不能隨意創(chuàng)建和關(guān)閉,這樣避免了連接隨意建立和關(guān)閉造成的系統(tǒng)開(kāi) 銷(xiāo)。java中提供了很多容器類(lèi),可以方便的構(gòu)建連接池,例如Vector,stack等。
第二、連接池的管理。連接池管理策略是連接池機(jī)制的核心,連接池內(nèi)連接的分配和釋放對(duì)系統(tǒng)的性能有很大的影響。其策略是:
當(dāng)客戶(hù)請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),首先查看連接池中是否有空閑 連接,如果存在空閑連接,則將連接分配給客戶(hù)使用;如果沒(méi)有控線(xiàn)連接,則查看當(dāng)前所開(kāi)的連接數(shù)是否已經(jīng)達(dá)到最大連接數(shù),例如如果沒(méi)有達(dá)到就重新創(chuàng)建一個(gè)請(qǐng) 求的客戶(hù);如果達(dá)到,就按設(shè)定的最大等待時(shí)間進(jìn)行等待,如果超出最大等待時(shí)間,則拋出異常給客戶(hù)。
當(dāng)客戶(hù)釋放數(shù)據(jù)庫(kù)連接時(shí),先判斷該連接的引用次數(shù)是否超過(guò)了規(guī)定值,如果超過(guò)了就從連接池中刪除該連接,否則就保留為其他客戶(hù)服務(wù)。該策略保證了數(shù)據(jù)庫(kù)連接的有效復(fù)用,避免了頻繁建立釋放連接所帶來(lái)的系統(tǒng)資源的開(kāi)銷(xiāo)。
第三、連接池的關(guān)閉。當(dāng)應(yīng)用程序退出時(shí),關(guān)閉連接池中所有的鏈接,釋放連接池相關(guān)資源,該過(guò)程正好與創(chuàng)建相反。
轉(zhuǎn)載于:https://www.cnblogs.com/jianmang/articles/4946979.html
總結(jié)
以上是生活随笔為你收集整理的数据库连接池的工作原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [转载]WSUS客户端排错--使用wsu
- 下一篇: 在VS2013中打开Nuget