hibernate 連接池 轉(zhuǎn)
Posted on 2010-01-12 18:00 asdtiang 閱讀(2122) 評(píng)論(0) 編輯 收藏 所屬分類: Hibernate study轉(zhuǎn)載:Hibernate的三種連接池設(shè)置C3P0、Proxool和DBCP |
|
以下三種連接都是以連接MySQl為例。 <!-- JDBC驅(qū)動(dòng)程序 --> <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK</property> <!-- 數(shù)據(jù)庫(kù)用戶名 --> <property name="connection.username">root</property> <!-- 數(shù)據(jù)庫(kù)密碼 --> <property name="connection.password">8888</property> 上面的一段配置,在c3p0和dbcp中,都是必需的,因?yàn)閔ibernate會(huì)根據(jù)上述的配置來(lái)生成connections,再交給c3p0或dbcp 管理.但是,proxool則不能,雖然說(shuō)服文檔上說(shuō)proxool也可以和hibernate結(jié)合,但我按照官方文檔上的說(shuō)明怎么配也出錯(cuò),而且,到了 sun和hibernat有的官方網(wǎng)站上問(wèn)了幾天,都沒(méi)有一個(gè)人回復(fù)。后來(lái)我只能讓proxool自身來(lái)生成連接,這在下面再講。 1 C3P0 只需在hibernate.cfg.xml中加入 <property name="c3p0.min_size">5</property> <property name="c3p0.max_size">30</property> <property name="c3p0.time_out">1800</property> <property name="c3p0.max_statement">50</property> 還有在classespath中加入c3p0-0.8.4.5.jar 2 dbcp 在hibernate.cfg.xml中加入 <property name="dbcp.maxActive">100</property> <property name="dbcp.whenExhaustedAction">1</property> <property name="dbcp.maxWait">60000</property> <property name="dbcp.maxIdle">10</property> <property name="dbcp.ps.maxActive">100</property> <property name="dbcp.ps.whenExhaustedAction">1</property> <property name="dbcp.ps.maxWait">60000</property> <property name="dbcp.ps.maxIdle">10</property> 還有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar. 3 proxool 在hibernate.cfg.xml中加入 <property name="proxool.pool_alias">pool1</property> <property name="proxool.xml">ProxoolConf.xml</property> <property name="connection.provider_class">net.sf.hibernate.connection.ProxoolConnectionProvider</property> 然后,在和hibernate.cfg.xml同一個(gè)目錄下,加一個(gè)ProxoolConf.xml文件,內(nèi)容為 <?xml version="1.0" encoding="utf-8"?> <!-- the proxool configuration can be embedded within your own application's. Anything outside the "proxool" tag is ignored. --> <something-else-entirely> <proxool> <alias>pool1</alias> <!--proxool只能管理由自己產(chǎn)生的連接--> <driver-url>jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK</driver-url> <driver-class>org.gjt.mm.mysql.Driver</driver-class> <driver-properties> <property name="user" value="root"/> <property name="password" value="8888"/> </driver-properties> <!-- proxool自動(dòng)偵察各個(gè)連接狀態(tài)的時(shí)間間隔(毫秒),偵察到空閑的連接就馬上回收,超時(shí)的銷毀--> <house-keeping-sleep-time>90000</house-keeping-sleep-time> <!-- 指因未有空閑連接可以分配而在隊(duì)列中等候的最大請(qǐng)求數(shù),超過(guò)這個(gè)請(qǐng)求數(shù)的用戶連接就不會(huì)被接受--> <maximum-new-connections>20</maximum-new-connections> <!-- 最少保持的空閑連接數(shù)--> <prototype-count>5</prototype-count> <!-- 允許最大連接數(shù),超過(guò)了這個(gè)連接,再有請(qǐng)求時(shí),就排在隊(duì)列中等候,最大的等待請(qǐng)求數(shù)由maximum-new-connections決定--> <maximum-connection-count>100</maximum-connection-count> <!-- 最小連接數(shù)--> <minimum-connection-count>10</minimum-connection-count> </proxool> </something-else-entirely> 并在classespath中加入proxool-0.8.3.jar 結(jié)論: 由于在hibernate3.0中,已經(jīng)不再支持dbcp了,hibernate的作者在hibernate.org中,明確指出在實(shí)踐中發(fā)現(xiàn)dbcp有 BUG,在某些種情會(huì)產(chǎn)生很多空連接不能釋放,所以拋棄了對(duì)dbcp的支持。我不知是否在dbcp最新版本中解決了這個(gè)問(wèn)題,我以前在一個(gè)訪問(wèn)量不大的項(xiàng) 目中用過(guò)dbcp,運(yùn)行了一年多都沒(méi)出現(xiàn)問(wèn)題。不過(guò)在網(wǎng)上的確也有不少網(wǎng)友指出dbcp在大型的應(yīng)用中會(huì)出現(xiàn)不穩(wěn)定的情況。所以在真相未經(jīng)證實(shí)的情況下, 我覺(jué)得對(duì)dbcp持慎重的態(tài)度。 至于c3p0,有評(píng)論說(shuō)它的算法不是最優(yōu)的,而且,我在matrix中,見到有網(wǎng)友做了一個(gè)實(shí)驗(yàn),在同一項(xiàng)目中分別用了幾個(gè)常用的連接池,然后測(cè)試其性 能,發(fā)現(xiàn)c3p0占用資源比較大,效率也不高。 所以,基于上述原因,我才花兩晚的時(shí)間去研究proxool的配置,proxool不少行家推薦使用,而且暫時(shí)來(lái)說(shuō),是負(fù)面評(píng)價(jià)是最少的一個(gè)。在三星中也 有項(xiàng)目是用proxool的。 |
Hibernate支持DBCP包進(jìn)行數(shù)據(jù)庫(kù)連接池的配置。簡(jiǎn)要說(shuō)明配置過(guò)程:
(僅僅是個(gè)人摸索,如有問(wèn)題,歡迎指點(diǎn))
需要的包:
Commons-Pool (下載地址:http://jakarta.apache.org/commons/pool/) :提供一個(gè)一般對(duì)象池的接口,而且包含實(shí)現(xiàn)了通常池工具箱。
Commons-DBCP(下載地址:http://jakarta.apache.org/commons/dbcp/) :提供數(shù)據(jù)庫(kù)連接池服務(wù)。DBCP很聰明,把Commons-Pool和JDBC的driver封裝起來(lái),使達(dá)到連接池的目的。
Hibernate屬性文件的配置參數(shù)
#連接池的最大活動(dòng)個(gè)數(shù)
hibernate.dbcp.maxActive 100
#當(dāng)連接池中的連接已經(jīng)被耗盡的時(shí)候,DBCP將怎樣處理( 0 = 失敗, 1 = 等待, 2= 增長(zhǎng))
hibernate.dbcp.whenExhaustedAction 1
#最大等待時(shí)間
hibernate.dbcp.maxWait 120000
#沒(méi)有人用連接的時(shí)候,最大閑置的連接個(gè)數(shù)。
hibernate.dbcp.maxIdle 10
##以下是對(duì)prepared statement的處理,同上。
hibernate.dbcp.ps.maxActive 100
hibernate.dbcp.ps.whenExhaustedAction 1
hibernate.dbcp.ps.maxWait 120000
hibernate.dbcp.ps.maxIdle 10
## 可選,是否對(duì)池化的連接進(jìn)行驗(yàn)證
#給出一條簡(jiǎn)單的sql語(yǔ)句進(jìn)行驗(yàn)證
#hibernate.dbcp.validationQuery select 1 from dual
#在取出連接時(shí)進(jìn)行有效驗(yàn)證
#hibernate.dbcp.testOnBorrow true
#在放回連接時(shí)進(jìn)行有效驗(yàn)證
#hibernate.dbcp.testOnReturn false
#Hibernate已經(jīng)實(shí)現(xiàn)了DBCP Provider實(shí)現(xiàn),別忘了在下面的鍵值去掉#字符
hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider
(僅僅是個(gè)人摸索,如有問(wèn)題,歡迎指點(diǎn))
需要的包:
Commons-Pool (下載地址:http://jakarta.apache.org/commons/pool/) :提供一個(gè)一般對(duì)象池的接口,而且包含實(shí)現(xiàn)了通常池工具箱。
Commons-DBCP(下載地址:http://jakarta.apache.org/commons/dbcp/) :提供數(shù)據(jù)庫(kù)連接池服務(wù)。DBCP很聰明,把Commons-Pool和JDBC的driver封裝起來(lái),使達(dá)到連接池的目的。
Hibernate屬性文件的配置參數(shù)
#連接池的最大活動(dòng)個(gè)數(shù)
hibernate.dbcp.maxActive 100
#當(dāng)連接池中的連接已經(jīng)被耗盡的時(shí)候,DBCP將怎樣處理( 0 = 失敗, 1 = 等待, 2= 增長(zhǎng))
hibernate.dbcp.whenExhaustedAction 1
#最大等待時(shí)間
hibernate.dbcp.maxWait 120000
#沒(méi)有人用連接的時(shí)候,最大閑置的連接個(gè)數(shù)。
hibernate.dbcp.maxIdle 10
##以下是對(duì)prepared statement的處理,同上。
hibernate.dbcp.ps.maxActive 100
hibernate.dbcp.ps.whenExhaustedAction 1
hibernate.dbcp.ps.maxWait 120000
hibernate.dbcp.ps.maxIdle 10
## 可選,是否對(duì)池化的連接進(jìn)行驗(yàn)證
#給出一條簡(jiǎn)單的sql語(yǔ)句進(jìn)行驗(yàn)證
#hibernate.dbcp.validationQuery select 1 from dual
#在取出連接時(shí)進(jìn)行有效驗(yàn)證
#hibernate.dbcp.testOnBorrow true
#在放回連接時(shí)進(jìn)行有效驗(yàn)證
#hibernate.dbcp.testOnReturn false
#Hibernate已經(jīng)實(shí)現(xiàn)了DBCP Provider實(shí)現(xiàn),別忘了在下面的鍵值去掉#字符
hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider
天蒼蒼,野茫茫,風(fēng)吹草底見牛羊