天天看點

資料庫連接配接池

資料庫連接配接池簡介:

資料庫連接配接對象是有限資源,是以資料庫連接配接池是用于負責配置設定、管理和釋放資料庫連接配接對象,它允許應用程式重複使用一個現有的資料庫連接配接對象,而不是再重建立立一個;這一點實際上和線程池的概念差不多。資料庫連接配接池會釋放空閑時間超過最大空閑時間的資料庫連接配接來避免因為沒有釋放資料庫連接配接而引起的資料庫連接配接遺漏,這項技術能明顯提高對資料庫操作的性能。

不使用線程池的話使用者每次請求都需要向資料庫獲得連結,而資料庫建立連接配接通常需要消耗相對較大的資源,建立時間也較長。假設網站一天10萬通路量,資料庫伺服器就需要建立10萬次連接配接,極大的浪費資料庫的資源,并且極易造成資料庫伺服器記憶體溢出、拓機。如下圖所示:

<a href="https://s4.51cto.com/oss/201710/28/b20e43117c2dbb6853501d27e1ce5f34.png" target="_blank"></a>

資料庫連接配接池負責配置設定,管理和釋放資料庫連接配接,它允許應用程式重複使用一個現有的資料庫連接配接,而不是重建立立一個。

如下圖所示:

<a href="https://s1.51cto.com/oss/201710/28/39ee4222440cac38bb83c722acad9f9b.png" target="_blank"></a>

c3p0與dbcp差別:

dbcp沒有自動回收空閑連接配接的功能

c3p0有自動回收空閑連接配接功能

  一般情況下,c3p0的使用率較高于dbcp,在公司用得比較多的也是c3p0。

資料庫連接配接池的運作機制:

(1)  程式初始化時建立連接配接池

(2) 使用時向連接配接池申請可用連接配接

(3) 使用完畢,将連接配接返還給連接配接池

(4) 程式退出時,斷開所有連接配接,并釋放資源

示意圖:

<a href="https://s4.51cto.com/oss/201710/28/3c651aba19260e266f59371d661fa575.png" target="_blank"></a>

資料庫連接配接池的最小連接配接數和最大連接配接數的設定要考慮到以下幾個因素:

1, 最小連接配接數:是連接配接池一直保持的資料庫連接配接,是以如果應用程式對資料庫連接配接的使用量不大,将會有大量的資料庫連接配接資源被浪費.

2, 最大連接配接數:是連接配接池能申請的最大連接配接數,如果資料庫連接配接請求超過次數,後面的資料庫連接配接請求将被加入到等待隊列中,這會影響以後的資料庫操作

3, 如果最小連接配接數與最大連接配接數相差很大:那麼最先連接配接請求将會獲利,之後超過最小連接配接數量的連接配接請求等價于建立一個新的資料庫連接配接.不過,這些大于最小連接配接數的資料庫連接配接在使用完不會馬上被釋放,他将被放到連接配接池中等待重複使用或是空間逾時後被釋放.

DBCP:

DBCP有幾個版本,其中的1.x和2.x版本的差別比較大,而且在2.x版本中稱為DBCP2。DBCP 2基于Commons Pool 2,與DBCP 1.x相比,提供了更高的性能,JMX支援以及衆多其他新功能。由于DBCP 2.x與DBCP 1.x不是二進制相容,是以更新到2.x的使用者應該知道Java包名稱已經改變,以及Maven坐标。使用者還應該注意,一些配置選項(例如maxActive to maxTotal)已被重命名,以将它們與Commons Pool 2使用的新名稱進行對齊。

不同版本的DBCP對JDK也有要求:

DBCP 1.3 版本隻能運作于 JDK 1.4-1.5 ,支援 JDBC 3

DBCP 1.4 版本隻能運作于 JDK 1.6 ,支援 JDBC 4

DBCP 2.x 版本隻能運作于 JDK 1.7 ,支援 JDBC 4.1

DBCP的jar包可以直接在Maven庫上下載下傳,隻需要找到依賴後配置一下即可,普通工程則去Apache官網下載下傳jar然後導入到工程裡即可:

Apache官網下載下傳位址:

<a href="http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi" target="_blank">http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi</a>

Maven中央倉庫配置依賴:

<a href="https://s5.51cto.com/oss/201710/28/afd01c295b38618b3e630e04dbbfceb1.png" target="_blank"></a>

配置依賴到pom檔案中:

<a href="https://s1.51cto.com/oss/201710/28/1f40f87c28cb0f64ddbb9d401aa73764.png" target="_blank"></a>

可以看到下載下傳了以下三個jar包:

<a href="https://s1.51cto.com/oss/201710/28/98fd5353c38ffa7073760d124a7f5134.png" target="_blank"></a>

如果是2.x以下的版本隻有2個包:commons-dbcpjar和commons-pool.jar

  我們都知道Java隻做規範不做實作,是以同樣的,Java制定了資料庫連接配接池的實作接口,這個接口就是DataSource,所有的資料庫連接配接池資料源類都需要實作這個接口。DBCP中實作了DataSource資料源接口的類是BasicDataSource,我們需要通過資料源實作類來獲得連接配接對象,這個類充當一個管理者的角色:

<a href="https://s1.51cto.com/oss/201710/28/3253207174ce9671680019341a07727f.png" target="_blank"></a>

下面我們做一個實驗來示範如何使用DBCP連接配接池:

代碼示例:

<a href="https://s4.51cto.com/oss/201710/28/0a3c96e04b2d2a61246a5473858b1db0.png" target="_blank"></a>

運作結果:

<a href="https://s3.51cto.com/oss/201710/28/6da602874e8ae0f943f57719d0bed6d9.png" target="_blank"></a>

從這個例子可以看出,實際使用連接配接池和直接使用JDBC來建立資料庫連接配接對象,在代碼上沒什麼太大的差別,一樣的得加載Driver驅動類,也要設定url和使用者密碼。隻不過使用連接配接池是通過資料源對象去池子裡獲得連接配接對象而已。

C3P0:

C3P0也是可以到Maven中央倉庫裡查詢依賴,然後配置到pom檔案裡即可,C3P0和DBCP的使用方式沒什麼差別,隻是方法和資料源實作類的名稱不一樣而已。

<a href="https://s3.51cto.com/oss/201710/28/854580580a856f286d47abacf2d172dd.png" target="_blank"></a>

配置文法:

<a href="https://s5.51cto.com/oss/201710/28/a0aee7cc759b89520ac4b596e6433231.png" target="_blank"></a>

可以看到下載下傳了以下兩個jar包:

<a href="https://s4.51cto.com/oss/201710/28/836d539c7919c8ffc4b3a236a6971d26.png" target="_blank"></a>

下面我們使用C3P0連接配接池也來做一下剛剛那個實驗:

<a href="https://s4.51cto.com/oss/201710/28/d9ff705678a0245380e493a99cebcb29.png" target="_blank"></a>

<a href="https://s1.51cto.com/oss/201710/28/fb6b2800c39a563b282537489bf733c7.png" target="_blank"></a>

有一點要注意的是,如果你工程環境裡有log4j,并且配置檔案裡的級别設定為DEBUG的話,C3P0會自動調用log4j列印一些DEBUG資訊:

<a href="https://s3.51cto.com/oss/201710/28/3ffca4ed8dfc37dd6689ffce39216c31.png" target="_blank"></a>

<a href="https://s5.51cto.com/oss/201710/28/8927974f5d42a5db6685e1ab2c350393.png" target="_blank"></a>

如果不想列印那麼多C3P0的DEBUG資訊,就把配置檔案裡的級别改為ERROR隻列印錯誤資訊級别即可:

<a href="https://s3.51cto.com/oss/201710/28/f224b5f48ba6726c5167d13c9a525652.png" target="_blank"></a>

不指定具體的資料庫連接配接:

在設定資料庫的URL時可以不指定具體的資料庫,本地連接配接直接寫localhost即可,遠端連接配接的話,就填寫IP位址和端口号。之後要連接配接某個資料庫的話,調用execute方法執行use指令來選擇資料庫即可。

  本地連接配接代碼示例:

<a href="https://s5.51cto.com/oss/201710/28/0312ddbf6760d01801771f46e016b698.png" target="_blank"></a>

遠端連接配接代碼示例:

<a href="https://s1.51cto.com/oss/201710/28/609469c52555ec8efc0575d9f4a4283f.png" target="_blank"></a>

本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/1977016,如需轉載請自行聯系原作者