DBCP,C3P0,Tomcat_JDBC 性能及穩定性測試

DBCP,C3P0,Tomcat_JDBC 性能及穩定性測試

1.測試環境:  

硬件環境:

數據庫服務器:2U*8核 8G內存 
測試服務器:   2U*8核 6G內存

軟件環境:

jdk:   

1.6.29

mysql:

5.0.77

mysql_driver:

mysql-connector-java-5.0.8-bin.jar

DBCP:

commons-dbcp-1.4.jar

下載地址: http://commons.apache.org/dbcp/

commons-pool-1.5.6.jar

下載地址: http://commons.apache.org/pool/

C3P0:

c3p0-0.9.1.2.jar

下載地址: http://www.mchange.com/projects/c3p0/index.html

log4j-1.2.8.jar(c3p0需要添加此包)

下載地址: http://logging.apache.org/log4j/

 Tomcat_JDBC:

        tomcat-jdbc.jar

下載地址: https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

或者在tomcat安裝根目錄下的lib目錄中直接拿來用之

tomcat-juli.jar

下載地址:(沒找到)

在tomcat安裝根目錄下的bin目錄中直接拿來用之 

配置信息:

數據庫連接超時時間設置爲:   10年

數據庫支持最大連接數設置爲:2000

初始化連接池大小:10

連接至最小活動線程數:10

連接池最大活動線程數:100

其他配置均保持各個連接池的默認配置

2.性能測試:   (測試代碼見附件)

測試點:

在多線程多任務的條件下,各個連接池獲取連接然後馬上關閉連接,比較所消耗的時間。

在網上看了好多關於數據庫連接池方面的測試,

大多數測試過程中,包括了執行sql語句部分,即,創建連接,執行sql語句,關閉連接,

一開始我也是這樣測試,

測試過過程中,發現數據很不穩定, 這幾個連接池都是忽快忽慢,

經過思考、分析,個人 覺得這樣是不準確的,執行sql語句時,測試已經不是數據庫連接池的性能了,

完全是數據庫驅動程序(例如mysql_driver )和數據庫本身的性能,

數據庫連接池負責的僅僅是建立DataSource,獲取(從連接池中獲取)Connection,關閉(放回到連接池)Connection,

因此,

我在測試時,沒有計算初始化連接池(建立DataSource)的時間,而是連接池“獲取連接然後馬上關閉連接”的時間。

測試結果:

 平均消耗時間是每個用例測試了5次計算出來的

DB POOL  線程數量  單線程
執行次數 
平均消耗
時間
(ms)
平均單條
時間
(ms) 
DBCP 10 1000 251 0.0251
C3P0 10 1000 802.8 0.08028
TomcatJDBC 10 1000 191.8 0.01918

 

DB POOL  線程數量  單線程
執行次數 
平均消耗
時間
(ms)
平均單條
時間
(ms) 
DBCP 100 1000 810.4 0.008104
C3P0 100 1000 2248.8 0.022488
TomcatJDBC 100 1000 726 0.00726

 

DB POOL  線程數量  單線程
執行次數 
平均消耗
時間
(ms)
平均單條
時間
(ms) 
DBCP 150 1000 1854.4 0.012363
C3P0 150 1000 2990.8 0.019939
TomcatJDBC 150 1000 861 0.00574

 

DB POOL  線程數量  單線程
執行次數 
平均消耗
時間
(ms)
平均單條
時間
(ms) 
DBCP 300 1000 3851.8 0.012839
C3P0 300 1000 6233.2 0.020777
TomcatJDBC 300 1000 3403.8 0.011346

 

結論:

總體性能:TomcatJDBC > DBCP > C3P0

網上好多資料都說C3P0的性能要好於DBCP,從我的測試結果來看並不是這樣,也許是我的配置有不正確的地方,

測試時最大的活動線程配置爲100,

併發爲150線程時,TomcatJDBC的優勢明顯,

也就是當併發超過連接池最大的活動線程數,但並沒有超過太多的情況下,TomcatJDBC的優勢明顯,

當併發數爲300時,3種連接池性能差距不大,

出現這種情況,說明連接池的最大活動線程數已經不滿足現有系統需求,需要調整配置了

我測試的結果都是毫秒級,

對於一個小型的系統,併發壓力不大時,選擇哪個連接池都沒有太大差別,考慮更多的應該是連接池的穩定性。

3.穩定性測試: (測試代碼見附件)

測試點:

1.當數據庫由於未知原因關閉,重新啓動後,連接池是否可以自動重連,無需重啓應用服務。

2.應用服務正常,數據庫服務正常,但是網絡環境異常,導致連接中斷,此時連接池中連接處於“半連接”狀態,

現象:

在不重啓應用服務的情況下, mysql數據庫進行重啓操作,mysql完全重啓後,執行程序,

TomcatJDBC和DBCP並沒有自動重連,重複執行查詢語句,會一直報異常,重啓應用服務後恢復正常

C3P0進行了自動重連,重複執行查詢語句,執行正常。

結論:

默認配置條件下,TomcatJDBC和DBCP並沒有自動重連機制,查看官方文檔,這缺陷可以通過修改配置解決。

另:

連接池重連機制,有2種:

1.同步驗證方式:

每次獲取連接或關閉連接時,執行一個預定義的驗證語句(sql語句),

驗證連接池中的連接是否有效,如果驗證失敗,徹底關閉此連接,

這種方式會導致每次執行數據庫操作時都有額外的開銷,對性能影響較大。

2.心跳驗證方式:

每隔特定的時間進行一次驗證,執行一個預定義的驗證語句(sql語句),

驗證連接池中的連接是否有效,如果驗證失敗,徹底關閉此連接,

可以根據具體情況,適當的調節驗證間隔時間。

這種方式以犧牲較小的性能開銷爲代價,來保持系統的穩定性。

4.心得

自從tomcat7發佈以來,網絡上開始出現一個新的連接池的影子,tomcat jdbc,
經過測試,發現tomcat jdbc的性能果然不錯,是連接池不二的選擇,
本人E文水平有限,沒辦法把E文翻譯的那麼優雅,
tomcat jdbc的其他優點,還請看它的官網介紹
https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

這篇文章詳細介紹闡述dbcp與c3p0的一些不足:
Why another connection pool project

重連機制:

不推薦使用同步驗證方式,

如果系統架構中,網絡環境(應用服務與數據庫服務之間)不穩定,硬件環境不穩定,推薦使用心跳驗證方式。

如果系統架構中,網絡環境和硬件環境都機器穩定,而且對數據庫I/O性能要求較高時,可以不進行驗證。

5.測試代碼見附件:

類:TestPerformance,性能測試

類:TestStability,穩定性測試,定時執行查詢語句,

類:TestWacthPool,自動重連測試,簡單觀察連接池內部狀態

如有有疑問可以加我QQ:   35443224   請說明您是51cto技術博客的朋友, ^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章