Java中几个主流的数据库连接池
池(Pool)技術(shù)在一定程度上可以明顯優(yōu)化服務(wù)器應(yīng)用程序的性能,提高程序執(zhí)行效率和降低系統(tǒng)資源開銷。這里所說的池是一種廣義上的池,比如數(shù)據(jù)庫連接池、線程池、內(nèi)存池、對象池等。其中,對象池可以看成保存對象的容器,在進(jìn)程初始化時創(chuàng)建一定數(shù)量的對象。需要時直接從池中取出一個空閑對象,用完后并不直接釋放掉對象,而是再放到對象池中以方便下一次對象請求可以直接復(fù)用。其他幾種池的設(shè)計思想也是如此,池技術(shù)的優(yōu)勢是,可以消除對象創(chuàng)建所帶來的延遲,從而提高系統(tǒng)的性能。
要了解Java連接池我們先要了解數(shù)據(jù)庫連接池(connection pool)的原理,Java連接池正是數(shù)據(jù)庫連接池在Java上的應(yīng)用。——我們知道,對于共享資源,有一個很著名的設(shè)計模式:資源池(Resource Pool)。
該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。為解決上述問題,可以采用數(shù)據(jù)庫連接池技術(shù)。數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。我們可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量﹑使用情況,為系統(tǒng)開發(fā)﹑測試及性能調(diào)整提供依據(jù)。
C3P0是一個開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發(fā)布,包括了實(shí)現(xiàn)jdbc3和jdbc2擴(kuò)展規(guī)范說明的Connection 和Statement 池的DataSources 對象。(主頁:http://sourceforge.net/projects/c3p0/)
BoneCP 是一個開源的快速的 JDBC 連接池。BoneCP很小,只有四十幾K(運(yùn)行時需要log4j和Google Collections的支持,這二者加起來就不小了),而相比之下 C3P0 要六百多K。另外個人覺得 BoneCP 有個缺點(diǎn)是,JDBC驅(qū)動的加載是在連接池之外的,這樣在一些應(yīng)用服務(wù)器的配置上就不夠靈活。當(dāng)然,體積小并不是 BoneCP 優(yōu)秀的原因,BoneCP 到底有什么突出的地方呢,請看看性能測試報告。(主頁:http://jolbox.com/)
DBCP (Database Connection Pool)是一個依賴Jakarta commons-pool對象池機(jī)制的數(shù)據(jù)庫連接池,Tomcat的數(shù)據(jù)源使用的就是DBCP。目前 DBCP 有兩個版本分別是 1.3 和 1.4。1.3 版本對應(yīng)的是 JDK 1.4-1.5 和 JDBC 3,而1.4 版本對應(yīng) JDK 1.6 和 JDBC 4。因此在選擇版本的時候要看看你用的是什么 JDK 版本了,功能上倒是沒有什么區(qū)別。(主頁:http://commons.apache.org/dbcp/)
Proxool是一個Java SQL Driver驅(qū)動程序,提供了對你選擇的其它類型的驅(qū)動程序的連接池封裝。可以非常簡單的移植到現(xiàn)存的代碼中。完全可配置。快速,成熟,健壯。可以透明地為你現(xiàn)存的JDBC驅(qū)動程序增加連接池功能。
數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點(diǎn)在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)得尤為突出。對數(shù)據(jù)庫連接的管理能顯著影響到整個應(yīng)用程序的伸縮性和健壯性,影響到程序的性能指標(biāo)。數(shù)據(jù)庫連接池正是針對這個問題提出來的。數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項(xiàng)技術(shù)能明顯提高對數(shù)據(jù)庫操作的性能。
Java中常用的數(shù)據(jù)庫連接池有:DBCP 、C3P0、BoneCP、Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager及Druid等。
Java開源數(shù)據(jù)連接池: http://www.open-open.com/20.htm
Hibernate常用三種連接池的配置:http://tieba.baidu.com/f?kz=70604644
幾種常用java連接池:http://hi.baidu.com/tangyudee/blog/item/f8bdb43decca892571cf6ced.html
感覺在介紹之前有必要闡述一下連接池的幾個概念,有助于后邊一些文字的理解。
最原始的數(shù)據(jù)庫使用就是打開一個連接并進(jìn)行使用,使用過后一定要關(guān)閉連接釋放資源。由于頻繁的打開和關(guān)閉連接對jvm包括數(shù)據(jù)庫
都有一定的資源負(fù)荷,尤其應(yīng)用壓力較大時資源占用比較多容易產(chǎn)生性能問題。由此使用連接池的作用就顯現(xiàn)出來,他的原理其實(shí)不復(fù)雜:
先打開一定數(shù)量的數(shù)據(jù)庫連接,當(dāng)使用的時候分配給調(diào)用者,調(diào)用完畢后返回給連接池,注意返回給連接池后這些連接并不會關(guān)閉,而是
準(zhǔn)備給下一個調(diào)用者進(jìn)行分配。由此可以看出連接池節(jié)省了大量的數(shù)據(jù)庫連接打開和關(guān)閉的動作,對系統(tǒng)性能提升的益處不言而喻。
幾個概念:
最小連接--應(yīng)用啟動后隨即打開的連接數(shù)以及后續(xù)最小維持的連接數(shù)。
最大連接數(shù)--應(yīng)用能夠使用的最多的連接數(shù)
連接增長數(shù)--應(yīng)用每次新打開的連接個數(shù)
舉個例子說明連接池的運(yùn)作:
假設(shè)設(shè)置了最小和最大的連接為10,20,那么應(yīng)用一旦啟動則首先打開10個數(shù)據(jù)庫連接,但注意此時數(shù)據(jù)庫連接池的正在使用數(shù)字為0--因?yàn)槟悴]有使用這些連接,而空閑的數(shù)量則是10。然后你開始登錄,假設(shè)登錄代碼使用了一個連接進(jìn)行查詢,那么此時數(shù)據(jù)庫連接池的正在使用數(shù)字為1、空閑數(shù)為9,這并不需要從數(shù)據(jù)庫打開連接--因?yàn)檫B接池已經(jīng)準(zhǔn)備好了10個給你留著呢。登錄結(jié)束了,當(dāng)前連接池的連接數(shù)量是多少?當(dāng)然是0,因?yàn)槟莻€連接隨著事務(wù)的結(jié)束已經(jīng)返還給連接池了。然后同時有11個人在同一秒進(jìn)行登錄,會發(fā)生什么:連接池從數(shù)據(jù)庫新申請(打開)了一個連接,連同另外的10個一并送出,這個瞬間連接池的使用數(shù)是11個,不過沒關(guān)系正常情況下過一會兒又會變成0。如果同時有21個人登錄呢?那第21個人就只能等前面的某個人登錄完畢后釋放連接給他。這時連接池開啟了20個數(shù)據(jù)庫連接--雖然很可能正在使用數(shù)量的已經(jīng)降為0,那么20個連接會一直保持嗎?當(dāng)然不,連接池會在一定時間內(nèi)關(guān)閉一定量的連接還給數(shù)據(jù)庫,在這個例子里數(shù)字是20-10=10,因?yàn)橹恍枰3肿钚∵B接數(shù)就好了,而這個時間周期也是連接池里配置的。
好了,基本概念說完了,言歸正傳進(jìn)行比較了。
首先說明的一點(diǎn),為了應(yīng)用便于移植以及可配置的角度,建議還是使用jndi統(tǒng)一進(jìn)行連接池的配置。怎么配置其實(shí)網(wǎng)上都有很多例子,
這里簡單舉個例子(使用spring框架):
首先在應(yīng)用的上下文定義中配置jndi名稱,如一個resource.xml文件,里邊的寫法
??? <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
??????? <property name="jndiName"><value>jdbc/myapp</value></property>
??? </bean>
注意dataSource這個bean在dao層(hibernate或jdbc)的配置文件里需要作為dataSource名稱的屬性配置到所有bean中
其中“jdbc/myds”這個就是jndi名稱了,下一步就是在應(yīng)用服務(wù)器連接池里進(jìn)行數(shù)據(jù)庫連接以及對應(yīng)的jndi配置了
一 開源數(shù)據(jù)連接池
1 dbcp
dbcp可能是使用最多的開源連接池,原因大概是因?yàn)榕渲梅奖?#xff0c;而且很多開源和tomcat應(yīng)用例子都是使用的這個連接池吧。
這個連接池可以設(shè)置最大和最小連接,連接等待時間等,基本功能都有。這個連接池的配置參見附件壓縮包中的:dbcp.xml
使用評價:在具體項(xiàng)目應(yīng)用中,發(fā)現(xiàn)此連接池的持續(xù)運(yùn)行的穩(wěn)定性還是可以,不過速度稍慢,在大并發(fā)量的壓力下穩(wěn)定性
有所下降,此外不提供連接池監(jiān)控
2 c3p0
c3p0是另外一個開源的連接池,在業(yè)界也是比較有名的,這個連接池可以設(shè)置最大和最小連接,連接等待時間等,基本功能都有。
這個連接池的配置參見附件壓縮包中的:c3p0.xml。
使用評價:在具體項(xiàng)目應(yīng)用中,發(fā)現(xiàn)此連接池的持續(xù)運(yùn)行的穩(wěn)定性相當(dāng)不錯,在大并發(fā)量的壓力下穩(wěn)定性也有一定保證,
????????? 此外不提供連接池監(jiān)控。
?????????
3 proxool
proxool這個連接池可能用到的人比較少,但也有一定知名度,這個連接池可以設(shè)置最大和最小連接,連接等待時間等,基本功能都有。
這個連接池的配置參見附件壓縮包中的:proxool.xml。
使用評價:在具體項(xiàng)目應(yīng)用中,發(fā)現(xiàn)此連接池的持續(xù)運(yùn)行的穩(wěn)定性有一定問題,有一個需要長時間跑批的任務(wù)場景任務(wù),同樣的代碼
在另外2個開源連接池中成功結(jié)束,但在proxool中出現(xiàn)異常退出。
但是proxool有一個優(yōu)勢--連接池監(jiān)控,這是個很誘人的東西,大概的配置方式就是在web.xml中添加如下定義:
??? <servlet>
??????? <servlet-name>admin</servlet-name>
??????? <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>?????
?? </servlet>
?? <servlet-mapping>
????? <servlet-name>admin</servlet-name>
????? <url-pattern>/admin</url-pattern>
?? </servlet-mapping>??
并在應(yīng)用啟動后訪問:http://localhost:8080/myapp/admin這個url即可監(jiān)控
不過proxool本身的包在監(jiān)測使用中會有編碼問題,附件中有一個
解決此問題的包,參見附件壓縮包中的:proxool-0.9.0RC3.jar。另外需要jdk1.5以上的環(huán)境。
總結(jié)時刻:
綜上所述,這幾種開源連接池各有優(yōu)劣,推薦使用c3p0,經(jīng)檢驗(yàn)這種連接池性能穩(wěn)定,承壓能力強(qiáng)。而proxool盡管有明顯的性能問題,
但由于它具備監(jiān)控功能,因此建議在開發(fā)測試時使用,有助于確定是否有連接沒有被關(guān)掉,可以排除一些代碼的性能問題。
二 商業(yè)中間件連接池
上面列舉了幾種開源的連接池,其實(shí)可以肯定的說,如果條件允許使用weblogic和websphere等中間件,那么不要猶豫,一定要
使用這些商業(yè)級別的中間件所自帶的數(shù)據(jù)庫連接池,他們的性能以及調(diào)配和開源的不在一個量級,舉個例子,曾經(jīng)有一個項(xiàng)目,數(shù)據(jù)量比較大,同樣的代碼應(yīng)用,在3種開源的連接池里都多少出現(xiàn)過系統(tǒng)異常,而weblogic和websphere的連接池則正常運(yùn)行,當(dāng)然后來發(fā)現(xiàn)代碼有一定瑕疵,但也側(cè)面說明了商業(yè)連接池的強(qiáng)大。
1 weblogic的連接池
weblogic 8 是一個讓人使用起來很輕松方便的應(yīng)用服務(wù)器軟件,但是到了9簡直就是折磨,不知道是bea是怎么想的,oracle收購了bea以后出了10,比9強(qiáng)不少,但是最喜歡的還是8。。。
題外話不說了,就以8.1版本介紹一下他的數(shù)據(jù)庫連接池(其實(shí)10的配置也差不多)
首先是連接池的基本設(shè)置,這個不講了,網(wǎng)上有很多教程。然后進(jìn)入Data Sources菜單配置數(shù)據(jù)源里邊的JNDI Name,要和之前在應(yīng)用配置中的一致:jdbc/myapp。
然后是連接池一些具體項(xiàng)目的配置,包括設(shè)置最小(Initial Capacity),最大( Maximum Capacity)連接,以及
每次連接增加時需要一次性增加多少連接(Capacity Increment)。Allow Shrinking(是否把不用的連接退還數(shù)據(jù)庫以保持最小連接數(shù)--這個就可以參見之前的連接池闡述的例子進(jìn)行理解了)。
另外還有幾個有意思的選項(xiàng)Test Reserved Connections:對取得的連接進(jìn)行測試,Test Released Connections:對釋放的連接進(jìn)行測試。有人會問了,這個有什么用啊?
不知道大家在項(xiàng)目中有沒有遇到j(luò)ava報連接失效的異常,反正我碰到過,只有在系統(tǒng)壓力大的時候才出現(xiàn)。而有了這個選項(xiàng)就不用擔(dān)心這個問題了--因?yàn)檫B接池已經(jīng)幫你測試了,一旦檢查到連接是無效的他會廢棄掉還給數(shù)據(jù)庫,只給你有效的。不過這個連接失效的異常其實(shí)多半是應(yīng)用的不嚴(yán)謹(jǐn)造成的,我們更因該關(guān)心應(yīng)代碼的問題--但起碼weblogic想到幫你彌補(bǔ)一下,是不是很貼心:)
另外一個重要功能當(dāng)然是連接池監(jiān)控:monitor選項(xiàng)卡里可以看到使用情況,有人又要問了,沒有什么指標(biāo)啊,別忘了custom view這個功能鏈接哦:)
有以下指標(biāo):當(dāng)前連接數(shù)、曾經(jīng)達(dá)到的峰值、可以使用的連接數(shù)、等待的連接數(shù)、從數(shù)據(jù)庫打開的連接數(shù)、曾經(jīng)關(guān)閉的連接數(shù)。。。其中前3項(xiàng)是我最關(guān)注的
使用評價:在具體項(xiàng)目應(yīng)用中,此連接池的持續(xù)運(yùn)行的穩(wěn)定性很強(qiáng),在大并發(fā)量的壓力下性能也相當(dāng)優(yōu)秀,另外在一些異常情況下連接池里的連接也能夠及時釋放。
????????? 連接池監(jiān)控一目了然,及時到位。????????
2 websphere的連接池
還是先來段題外話:記得有人說過,websphere只有版本6以后才算是websphere,個人很贊同。websphere 5以及以前的版本。。。還是忘了吧。
其實(shí)websphere的連接池秉承ibm一貫的風(fēng)格:功能強(qiáng)大,使用復(fù)雜:)
進(jìn)入控制臺使用“JDBC提供程序”功能菜單進(jìn)行連接池的基本配置,一路下來,不同的數(shù)據(jù)庫配置方式不盡相同,最奇怪的是還要單獨(dú)手工加上user和password參數(shù),如果沒有
資料指導(dǎo)的話還真是摸不著頭腦。這些基本設(shè)置還是網(wǎng)上找吧很多的。連接池設(shè)置完還需要設(shè)置數(shù)據(jù)源,jndi名字一樣與之前的對應(yīng):jdbc/myapp
高級設(shè)置包括初始化連接數(shù),最大連接,連接有效性檢查,不使用超時。。其實(shí)這些都和weblogic中的連接池配置大致一樣。
連接池監(jiān)控:使用運(yùn)行監(jiān)控菜單,里邊會有一個監(jiān)控項(xiàng)目選擇,選jdbc監(jiān)控即可,可惡的是一開始彈出什么服務(wù)器操作系統(tǒng)需要安裝什么圖形化控件,選擇是那么就得去找到控件在操作系統(tǒng)(linux)下安裝,然后很多的依賴組件都沒有。。。搞了半天才發(fā)現(xiàn)選擇否,監(jiān)控數(shù)據(jù)以及圖形一樣能出來嘛,真是要怒了。
雖然經(jīng)過一番波折但是監(jiān)控的內(nèi)容還是很強(qiáng)大的,就連接池來說一樣包括當(dāng)前連接數(shù)、曾經(jīng)達(dá)到的峰值、可以使用的連接數(shù)、從數(shù)據(jù)庫打開的連接數(shù)、曾經(jīng)關(guān)閉的連接數(shù)。。。其中前3項(xiàng)是我最關(guān)注的,比較奇怪的現(xiàn)象是應(yīng)用剛啟動的時候已開啟的連接數(shù)量竟然沒有達(dá)到初始定義的連接數(shù)量,不清楚websphere是怎么個計算機(jī)制。
另外在壓力大的時候可使用的連接數(shù)會是負(fù)數(shù),當(dāng)時很奇怪,想想也了然了,那個負(fù)數(shù)肯定是排隊(duì)等待的數(shù)量了
使用評價:在具體項(xiàng)目應(yīng)用中,此連接池的持續(xù)運(yùn)行的穩(wěn)定性相當(dāng)強(qiáng),在大并發(fā)量的壓力下性能也足夠優(yōu)秀,另外在一些異常情況下連接池里的連接能夠及時釋放,
????????? 連接池監(jiān)控配置有些復(fù)雜,但是配置好后各項(xiàng)指標(biāo)一目了然并且有圖形顯示?
-
Druid 連接池簡介
Druid首先是一個數(shù)據(jù)庫連接池。Druid是目前最好的數(shù)據(jù)庫連接池,在功能、性能、擴(kuò)展性方面,都超過其他數(shù)據(jù)庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已經(jīng)在阿里巴巴部署了超過600個應(yīng)用,經(jīng)過一年多生產(chǎn)環(huán)境大規(guī)模部署的嚴(yán)苛考驗(yàn)。
同時Druid不僅僅是一個數(shù)據(jù)庫連接池,它包括四個部分:
?? ?Druid是一個JDBC組件,它包括三個部分:
????基于Filter-Chain模式的插件體系。
????DruidDataSource 高效可管理的數(shù)據(jù)庫連接池。
????SQLParser
Druid的功能
1、替換DBCP和C3P0。Druid提供了一個高效、功能強(qiáng)大、可擴(kuò)展性好的數(shù)據(jù)庫連接池。
2、可以監(jiān)控數(shù)據(jù)庫訪問性能,Druid內(nèi)置提供了一個功能強(qiáng)大的StatFilter插件,能夠詳細(xì)統(tǒng)計SQL的執(zhí)行性能,這對于線上分析數(shù)據(jù)庫訪問性能有幫助。
3、數(shù)據(jù)庫密碼加密。直接把數(shù)據(jù)庫密碼寫在配置文件中,這是不好的行為,容易導(dǎo)致安全問題。DruidDruiver和DruidDataSource都支持PasswordCallback。
4、SQL執(zhí)行日志,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4j和JdkLog,你可以按需要選擇相應(yīng)的LogFilter,監(jiān)控你應(yīng)用的數(shù)據(jù)庫訪問情況。
5、擴(kuò)展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter機(jī)制,很方便編寫JDBC層的擴(kuò)展插件。
-
使用原因
? ? ? ? ? ? ?原先項(xiàng)目使用的是C3P0連接池,在項(xiàng)目發(fā)布使用一段時間后發(fā)現(xiàn)c3p0 連接池訪問數(shù)據(jù)庫的時候創(chuàng)建連接會在oralce的lisenter.log 日志文件記錄。?
經(jīng)過一段時間觀察發(fā)現(xiàn)oralce每6秒會在lisenter.log日志記錄一次,我們設(shè)置的最小連接是20,所以oracle每次會在日志記錄20條。隨著時間越長日志文件越來越大,當(dāng)日志文件達(dá)到4個G的時候會導(dǎo)致oracle死掉。 經(jīng)過不斷調(diào)整參數(shù)配置還是無法得到解決方案,最后選擇使用阿里Druid連接池試試,Druid默認(rèn)最小連接2個,配置好后發(fā)布觀察日志發(fā)現(xiàn)只在創(chuàng)建的時候在日志里面記錄了2條記錄。沒有像C3P0那樣每6秒記錄一次導(dǎo)致日志文件越來越大。?
lisenter.log 日志截圖
-
Druid使用
? ? ? ?1. Druid.jar包
? ? ? ? ? ? ? ? ? ? ? ?druid-1.1.4.jar ? 1.1.4
? ? ? ?2.Druid連接池配置
? ? ? ? ? ? ? ? ??? ?
? ? ? ? ? ?這里沒有配置最小連接數(shù) ,默認(rèn)為2個。
? ? ? ? 3.Druid屬性配置圖
| 配置 | 缺省值 |
| |
| name | 配置這個屬性的意義在于,如果存在多個數(shù)據(jù)源,監(jiān)控的時候? 可以通過名字來區(qū)分開來。如果沒有配置,將會生成一個名字,? 格式是:"DataSource-" + System.identityHashCode(this) | ||
| jdbcUrl | 連接數(shù)據(jù)庫的url,不同數(shù)據(jù)庫不一樣。例如:? mysql : jdbc:mysql://10.20.153.104:3306/druid2?? oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto | ||
| username | 連接數(shù)據(jù)庫的用戶名 | ||
| password | 連接數(shù)據(jù)庫的密碼。如果你不希望密碼直接寫在配置文件中,? 可以使用ConfigFilter。詳細(xì)看這里:? 使用ConfigFilter · alibaba/druid Wiki · GitHub | ||
| driverClassName | 根據(jù)url自動識別 | 這一項(xiàng)可配可不配,如果不配置druid會根據(jù)url自動識別dbType,然后選擇相應(yīng)的driverClassName | |
| initialSize | 0 | 初始化時建立物理連接的個數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時 | |
| maxActive | 8 | 最大連接池數(shù)量 | |
| maxIdle | 8 | 已經(jīng)不再使用,配置了也沒效果 | |
| minIdle | 最小連接池數(shù)量 | ||
| maxWait | 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。 | ||
| poolPreparedStatements | false | 是否緩存preparedStatement,也就是PSCache。? PSCache對支持游標(biāo)的數(shù)據(jù)庫性能提升巨大,比如說oracle。? 在mysql5.5以下的版本中沒有PSCache功能,建議關(guān)閉掉。 作者在5.5版本中使用PSCache,通過監(jiān)控界面發(fā)現(xiàn)PSCache有緩存命中率記錄,? 該應(yīng)該是支持PSCache。 | |
| maxOpenPreparedStatements | -1 | 要啟用PSCache,必須配置大于0,當(dāng)大于0時,? poolPreparedStatements自動觸發(fā)修改為true。? 在Druid中,不會存在Oracle下PSCache占用內(nèi)存過多的問題,? 可以把這個數(shù)值配置大一些,比如說100 | |
| validationQuery | 用來檢測連接是否有效的sql,要求是一個查詢語句。? 如果validationQuery為null,testOnBorrow、testOnReturn、? testWhileIdle都不會其作用。 | ||
| testOnBorrow | true | 申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。 | |
| testOnReturn | false | 歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能 | |
| testWhileIdle | false | 建議配置為true,不影響性能,并且保證安全性。? 申請連接的時候檢測,如果空閑時間大于? timeBetweenEvictionRunsMillis,? 執(zhí)行validationQuery檢測連接是否有效。 | |
| timeBetweenEvictionRunsMillis | 有兩個含義:? 1) Destroy線程會檢測連接的間隔時間? 2) testWhileIdle的判斷依據(jù),詳細(xì)看testWhileIdle屬性的說明 | ||
| numTestsPerEvictionRun | 不再使用,一個DruidDataSource只支持一個EvictionRun | ||
| minEvictableIdleTimeMillis | |||
| connectionInitSqls | 物理連接初始化的時候執(zhí)行的sql | ||
| exceptionSorter | 根據(jù)dbType自動識別 | 當(dāng)數(shù)據(jù)庫拋出一些不可恢復(fù)的異常時,拋棄連接 | |
| filters | 屬性類型是字符串,通過別名的方式配置擴(kuò)展插件,? 常用的插件有:? 監(jiān)控統(tǒng)計用的filter:stat?? 日志用的filter:log4j? 防御sql注入的filter:wall | ||
| proxyFilters | 類型是List<com.alibaba.druid.filter.Filter>,? 如果同時配置了filters和proxyFilters,? 是組合關(guān)系,并非替換關(guān)系 |
4.數(shù)據(jù)源監(jiān)控配置
在項(xiàng)目的web.xml加上以下代碼
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
1 <filter>2 <filter-name>DruidWebStatFilter</filter-name>3 <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>4 <init-param>5 <param-name>exclusions</param-name>6 <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>7 </init-param>8 </filter>9 <filter-mapping> 10 <filter-name>DruidWebStatFilter</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping> 13 14 <servlet> 15 <servlet-name>DruidStatView</servlet-name> 16 <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class> 17 </servlet> 18 <servlet-mapping> 19 <servlet-name>DruidStatView</servlet-name> 20 <url-pattern>/druid/*</url-pattern> 21 </servlet-mapping>
?????????
總結(jié)時刻:
這兩種商業(yè)級別的連接池都給我留下深刻印象,功能強(qiáng)大,使用穩(wěn)定,性能優(yōu)秀,監(jiān)控到位。可以說難分伯仲,相對而言weblogic的連接池使用配置和監(jiān)控配置更簡單明了,而websphere的更復(fù)雜但選項(xiàng)功能也更多一些。其實(shí)這正是對兩種應(yīng)用服務(wù)器的使用印象的直接反映,當(dāng)然總體比較2種應(yīng)用服務(wù)器應(yīng)該又是另一個話題了,也許在下一期的內(nèi)容里。。。
比較了多種連接池的優(yōu)劣,下面這個話題可能和比較本身沒有直接關(guān)系,但個人認(rèn)為應(yīng)該是更有價值的一些經(jīng)驗(yàn)分享吧,那就是---這么多指標(biāo)配置,那些最大和最小連接數(shù)以及其他一些必要的配置指標(biāo),在一個正式的生產(chǎn)項(xiàng)目中到底應(yīng)該配置什么值呢?
其實(shí)這個值首先還是要根據(jù)具體的項(xiàng)目情況、數(shù)據(jù)規(guī)模以及并發(fā)數(shù)來制定的(盡管像是套話,但是我們研發(fā)人員嚴(yán)謹(jǐn)?shù)淖黠L(fēng)還是必要的:)。具體而言在中型偏小型的項(xiàng)目--給個數(shù)值把,用戶數(shù)300到3000,數(shù)據(jù)量100萬到1億---中,建議weblogic設(shè)置為最大和最小都是200,websphere最小200最大300,前提是2者設(shè)置的最小內(nèi)存要在1G以上,當(dāng)然如果條件允許內(nèi)存越大越好,不過32位機(jī)內(nèi)存1.5G的限制是一定的(64位嘛我愿意設(shè)個4G內(nèi)存過來,速度提升的感覺很爽啊)。這個數(shù)字出來以后相信會有不少問題要拋過來,我一一談一下自己的體驗(yàn)和想法吧
1 為什么是200或300而不是更高?
回答:? 再分配多了效果也不大了,一個是應(yīng)用服務(wù)器維持這個連接數(shù)需要內(nèi)存支持,剛才說了32位的機(jī)器只能支持到1.5G,并且維護(hù)大量的連接進(jìn)行分配使用對cpu也是一個不小的負(fù)荷,因此不宜太大。
2 為什么不小一點(diǎn)?
回答:?? 如果太小,那么在上述規(guī)模項(xiàng)目的并發(fā)量以及數(shù)據(jù)量上來以后會造成排隊(duì)現(xiàn)象,系統(tǒng)會變慢,數(shù)據(jù)庫連接會經(jīng)常打開和關(guān)閉,性能上有壓力,用戶體驗(yàn)也不好。
3 為什么weblogic最小最大都一樣,而websphere不一樣
回答:?? 其實(shí)和分配內(nèi)存的最小最大值的情況一樣,一般都推薦2個值應(yīng)該一致,都放在內(nèi)存里就好了嘛。但是ibm官方推薦2個值要有區(qū)別---官方說法還是要聽的
4 其他開源連接池的分配方案還沒說呢?
回答: 開源的個人認(rèn)為到100就可以了,再高他也不會太穩(wěn)定,當(dāng)然1G的最小內(nèi)存是一定要給tomcat分的
總結(jié)
以上是生活随笔為你收集整理的Java中几个主流的数据库连接池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK库rt包中常用包说明
- 下一篇: java美元兑换,(Java实现) 美元