關(guān)于JAVA的數(shù)據(jù)庫連接池的探討
東軟集團(tuán)股份有限公司 劉歡杰 魏靜敏 2014/1/27 19:04:43
摘要:本文首先提出了一個(gè)性能問題,然后針對(duì)該問題進(jìn)行了調(diào)查,并找到原因:是數(shù)據(jù)源配置引起的,進(jìn)一步對(duì)帶連接池的數(shù)據(jù)源進(jìn)行了總結(jié)。本文給DB訪問性能調(diào)查提供了一個(gè)方向,并且對(duì)連接池的數(shù)據(jù)源配置進(jìn)行了比較和總結(jié)。
關(guān)鍵字:JAVA;數(shù)據(jù)源;連接池;JNDI;DBCP
一、問題描述
最近在使用spring框架進(jìn)行web項(xiàng)目的開發(fā),其中有一部分處理:批量的db操作,可以通過web頁面由用戶手動(dòng)執(zhí)行,也可以通過window的任務(wù)管理器調(diào)用批處理進(jìn)行。Web服務(wù)器使用的是tomcat,測(cè)試時(shí)發(fā)現(xiàn)批處理的執(zhí)行時(shí)間大約是web頁面的手動(dòng)執(zhí)行時(shí)間的4倍多。
二、調(diào)查過程
首先通過分析代碼,發(fā)現(xiàn)Web和批處理調(diào)用同一段代碼,兩者的代碼完全相同,只有配置文件略有不同。因此排除了代碼的原因。通過追加log發(fā)現(xiàn)兩者的差別主要集中在db操作上,相同的數(shù)據(jù)等環(huán)境下,相同的sql文批處理執(zhí)行的時(shí)間大約是web執(zhí)行的4倍,而整個(gè)處理過程中db操作占絕大部分時(shí)間,以外的邏輯處理時(shí)間可以忽略不計(jì),因此可以判斷整個(gè)處理中批處理慢的原因就是由于db操作引起的。進(jìn)一步調(diào)查發(fā)現(xiàn)是兩者的數(shù)據(jù)源配置不同,批處理使用的數(shù)據(jù)源是spring的DriverManagerDataSource,而web使用的數(shù)據(jù)源是tomcat提供的。通過調(diào)查將批處理的數(shù)據(jù)源修改為apache的dbcp,并且下載第三方的2個(gè)包:commons-dbcp.jar,commons-pool.jar。
經(jīng)過測(cè)試,批處理的性能提高了,批處理的時(shí)間和web中手動(dòng)處理的時(shí)間基本相同。
三、原因分析
數(shù)據(jù)源分為兩種,一種是不帶連接池的數(shù)據(jù)源,另外一種是帶連接池的數(shù)據(jù)源,第一種
一般用于db連接的測(cè)試,商業(yè)中一般用第二種。不帶連接池的數(shù)據(jù)源每次在進(jìn)行數(shù)據(jù)庫操作時(shí)會(huì)進(jìn)行一下四步[1]:1)裝載數(shù)據(jù)庫驅(qū)動(dòng)程序,2)建立數(shù)據(jù)庫連接,3)訪問數(shù)據(jù)庫執(zhí)行SQL語句,4)斷開數(shù)據(jù)庫連接,因此比較花費(fèi)時(shí)間,而帶連接池的數(shù)據(jù)源,每次在進(jìn)行數(shù)據(jù)庫操作時(shí)不需要1),3),4)的操作。這樣就節(jié)省了時(shí)間。批處理使用的DriverManagerDataSource就屬于第一種,它不依賴于其他第三方軟件,由spring自己提供。而帶連接池的數(shù)據(jù)源一般依賴于第三方軟件。需要下載第三方的jar包。修正后的批處理使用的BasicDataSource屬于第二種,是帶連接池的數(shù)據(jù)源。它提供了close()方法關(guān)閉數(shù)據(jù)源,所以必須設(shè)定destroy-method=”close”屬性,以便Spring容器關(guān)閉時(shí),數(shù)據(jù)源能夠正常關(guān)閉。
四、數(shù)據(jù)源組件總結(jié)
對(duì)于提供連接池的數(shù)據(jù)源來說,除了Apache的DBCP以外,還有C3P0,Proxool, BoneCP等。具體如表1所示。
表1 基于JAVA的帶連接池的數(shù)據(jù)源組件
序號(hào) 連接池名稱 依賴的JAR包 實(shí)現(xiàn)的DATASOURCE類 特點(diǎn)
1 JNDI 由相應(yīng)的web服務(wù)器負(fù)責(zé)初始化、創(chuàng)建、管理。程序中不需要引入特別的jar包。 Javax.sql.datasource
是由web服務(wù)器,實(shí)現(xiàn)了java.sql.datasource。不需要在項(xiàng)目project中引入特別的jar包,但是需要在服務(wù)器的某些配置文件中增加相關(guān)的配置。
2 DBCP commons-dbcp.jar
commons-pool.jar org.apache.commons.dbcp.BasicDataSource 是apache提供的數(shù)據(jù)源連接池方式,支持?jǐn)?shù)據(jù)庫連接池創(chuàng)建,管理connection等功能。
3 C3P0 c3p0-0.9.xxx.jar com.mchange.v2.c3p0.
ComboPooledDataSource C3P0是開源的數(shù)據(jù)庫連接組件,支持創(chuàng)建數(shù)據(jù)庫連接池,管理connection等功能。
4 Proxool proxool-0.9.1.jar
proxool-cglib.jar org.logicalcobwebs.proxool.ProxoolDataSource 這是一個(gè)Java SQL Driver驅(qū)動(dòng)程序,提供了選擇的其它類型的驅(qū)動(dòng)程序的連接池封裝?珊(jiǎn)單的移植到現(xiàn)存的代碼中?赏该鞯貫楝F(xiàn)存的JDBC驅(qū)動(dòng)程序增加連接池功能。
5 BoneCP bonecp-0.6.5.jar(適用jdk5)
bonecp-0.7.1.RELEASE.jar(適用jdk6) Bone(未完,下一頁)
附件下載:點(diǎn)擊下載全部文件
|