數(shù)據(jù)庫連接池技術(shù)的原理
應(yīng)用程序直接獲取數(shù)據(jù)庫連接的缺點(diǎn)
用戶每次請求都需要向數(shù)據(jù)庫獲得鏈接,而數(shù)據(jù)庫創(chuàng)建連接通常需要消耗相對較大的資源,創(chuàng)建時(shí)間也較長。假設(shè)網(wǎng)站一天10萬訪問量,數(shù)據(jù)庫服務(wù)器就需要?jiǎng)?chuàng)建10萬次連接,極大的浪費(fèi)數(shù)據(jù)庫的資源,并且極易造成數(shù)據(jù)庫服務(wù)器內(nèi)存溢出、拓機(jī)。
數(shù)據(jù)庫連接池的基本概念
所謂的數(shù)據(jù)庫連接池技術(shù),就是用來分配,管理,釋放數(shù)據(jù)庫連接的.你也許會(huì)問,好像我直接用JDBC也能夠?qū)崿F(xiàn)這些功能吧。
嗯,你說的沒錯(cuò),JDBC確實(shí)也可以,但是,你記不記得,我們使用JDBC技術(shù)的時(shí)候,每次用完了,是不是都會(huì)將連接關(guān)閉;等到下一次再用的時(shí)候,是不是都得將數(shù)據(jù)庫連接再打開?
實(shí)際上,數(shù)據(jù)庫鏈接資源是十分寶貴的,我們在小型的項(xiàng)目中還看不出來,在高并發(fā)的項(xiàng)目中,你會(huì)發(fā)現(xiàn),這樣頻繁的打開和關(guān)閉數(shù)據(jù)庫鏈接是對服務(wù)器的一種摧殘,十分影響效率.
那么,數(shù)據(jù)庫連接池是如何做的呢?
實(shí)現(xiàn)思路是這樣的:在每次有訪問的時(shí)候,數(shù)據(jù)庫連接池會(huì)給用戶分配一個(gè)數(shù)據(jù)庫連接,當(dāng)用戶用完了連接之后,連接池再將連接回收,放回一個(gè)連接集合中.
原理就是這樣的,我們來看一下這張圖加深印象:
這樣你可能還是不太清楚,而且,數(shù)據(jù)庫連接池要考慮的東西要比上面說的更復(fù)雜
作用
數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項(xiàng)技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
影響因素
數(shù)據(jù)庫連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池中, 這些數(shù)據(jù)庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設(shè)定的.無論這些數(shù)據(jù)庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數(shù)量.連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時(shí),這些請求將被加入到等待隊(duì)列中.
數(shù)據(jù)庫連接池的最小連接數(shù)和最大連接數(shù)的設(shè)置要考慮到以下幾個(gè)因素:
- 最小連接數(shù):是連接池一直保持的數(shù)據(jù)庫連接,所以如果應(yīng)用程序?qū)?shù)據(jù)庫連接的使用量不大,將會(huì)有大量的數(shù)據(jù)庫連接資源被浪費(fèi).
- 最大連接數(shù):是連接池能申請的最大連接數(shù),如果數(shù)據(jù)庫連接請求超過次數(shù),后面的數(shù)據(jù)庫連接請求將被加入到等待隊(duì)列中,這會(huì)影響以后的數(shù)據(jù)庫操作
- 如果最小連接數(shù)與最大連接數(shù)相差很大:那么最先連接請求將會(huì)獲利,之后超過最小連接數(shù)量的連接請求等價(jià)于建立一個(gè)新的數(shù)據(jù)庫連接.不過,這些大于最小連接數(shù)的數(shù)據(jù)庫連接在使用完不會(huì)馬上被釋放,他將被放到連接池中等待重復(fù)使用或是空間超時(shí)后被釋放.
原理
連接池基本的思想是在系統(tǒng)初始化的時(shí)候,將數(shù)據(jù)庫連接作為對象存儲(chǔ)在內(nèi)存中,當(dāng)用戶需要訪問數(shù)據(jù)庫時(shí),并非建立一個(gè)新的連接,而是從連接池中取出一個(gè)已建立的空閑連接對象。使用完畢后,用戶也并非將連接關(guān)閉,而是將連接放回連接池中,以供下一個(gè)請求訪問使用。而連接的建立、斷開都由連接池自身來管理。同時(shí),還可以通過設(shè)置連接池的參數(shù)來控制連接池中的初始連接數(shù)、連接的上下限數(shù)以及每個(gè)連接的最大使用次數(shù)、最大空閑時(shí)間等等。也可以通過其自身的管理機(jī)制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。