轉載:Hibernate的三種鏈接池設置C3P0、Proxool和DBCP |
|
如下三種鏈接都是以鏈接MySQl爲例。
org.gjt.mm.mysql.Driver
jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK
root
8888
上面的一段配置,在c3p0和dbcp中,都是必需的,由於hibernate會根據上述的配置來生成connections,再交給c3p0或dbcp 管理.可是,proxool則不能,雖說服文檔上說proxool也能夠和hibernate結合,但我按照官方文檔上的說明怎麼配也出錯,並且,到了 sun和hibernat有的官方網站上問了幾天,都沒有一我的回覆。後來我只能讓proxool自身來生成鏈接,這在下面再講。 1 C3P0 只需在hibernate.cfg.xml中加入
5
30
1800
50
還有在classespath中加入c3p0-0.8.4.5.jar 2 dbcp 在hibernate.cfg.xml中加入
100
1
60000
10
100
1
60000
10
還有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar. 3 proxool 在hibernate.cfg.xml中加入
pool1
ProxoolConf.xml
net.sf.hibernate.connection.ProxoolConnectionProvider
而後,在和hibernate.cfg.xml同一個目錄下,加一個ProxoolConf.xml文件,內容爲
pool1
jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK
org.gjt.mm.mysql.Driver
90000
20
5
100
10
並在classespath中加入proxool-0.8.3.jar 結論: 因爲在hibernate3.0中,已經再也不支持dbcp了,hibernate的做者在hibernate.org中,明確指出在實踐中發現dbcp有 BUG,在某些種情會產生不少空鏈接不能釋放,因此拋棄了對dbcp的支持。我不知是否在dbcp最新版本中解決了這個問題,我之前在一個訪問量不大的項 目中用過dbcp,運行了一年多都沒出現問題。不過在網上的確也有很多網友指出dbcp在大型的應用中會出現不穩定的狀況。因此在真相未經證明的狀況下, 我以爲對dbcp持慎重的態度。 至於c3p0,有評論說它的算法不是最優的,並且,我在matrix中,見到有網友作了一個實驗,在同一項目中分別用了幾個經常使用的鏈接池,而後測試其性 能,發現c3p0佔用資源比較大,效率也不高。 因此,基於上述緣由,我才花兩晚的時間去研究proxool的配置,proxool很多行家推薦使用,並且暫時來講,是負面評價是最少的一個。在三星中也 有項目是用proxool的。 |
Hibernate支持DBCP包進行數據庫鏈接池的配置。簡要說明配置過程:
(僅僅是我的摸索,若有問題,歡迎指點)
須要的包:
Commons-Pool (下載地址:http://jakarta.apache.org/commons/pool/) :提供一個通常對象池的接口,並且包含實現了一般池工具箱。
Commons-DBCP(下載地址:http://jakarta.apache.org/commons/dbcp/) :提供數據庫鏈接池服務。DBCP很聰明,把Commons-Pool和JDBC的driver封裝起來,使達到鏈接池的目的。
Hibernate屬性文件的配置參數
#鏈接池的最大活動個數
hibernate.dbcp.maxActive 100
#當鏈接池中的鏈接已經被耗盡的時候,DBCP將怎樣處理( 0 = 失敗, 1 = 等待, 2= 增加)
hibernate.dbcp.whenExhaustedAction 1
#最大等待時間
hibernate.dbcp.maxWait 120000
#沒有人用鏈接的時候,最大閒置的鏈接個數。
hibernate.dbcp.maxIdle 10
##如下是對prepared statement的處理,同上。
hibernate.dbcp.ps.maxActive 100
hibernate.dbcp.ps.whenExhaustedAction 1
hibernate.dbcp.ps.maxWait 120000
hibernate.dbcp.ps.maxIdle 10
## 可選,是否對池化的鏈接進行驗證
#給出一條簡單的sql語句進行驗證
#hibernate.dbcp.validationQuery select 1 from dual
#在取出鏈接時進行有效驗證
#hibernate.dbcp.testOnBorrow true
#在放回鏈接時進行有效驗證
#hibernate.dbcp.testOnReturn false
#Hibernate已經實現了DBCP Provider實現,別忘了在下面的鍵值去掉#字符
hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider