Hibernate的三種連接池設置C3P0、Proxool和DBCP


以下三種連接都是以連接MySQl為例。 

<!-- JDBC驅動程序 --> 
<property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK</property> <!-- 數據庫用户名 --> 
<property name="connection.username">root</property> <!-- 數據庫密碼 --> 
<property name="connection.password">8888</property> 

上 面的一段配置,在c3p0和dbcp中,都是必需的,因為hibernate會根據上述的配置來生成connections,再交給c3p0或dbcp管 理.但是,proxool則不能,雖然説服文檔上説proxool也可以和hibernate結合,但我按照官方文檔上的説明怎麼配也出錯,而且,到了 sun和hibernat有的官方網站上問了幾天,都沒有一個人回覆。後來我只能讓proxool自身來生成連接,這在下面再講。 


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 

由於數據庫connection在較長時間沒有訪問下會自動斷開連接,導致瀏覽出錯,增加proxool作為數據庫pool。它有自動連接功能。 
1)、從http://proxool.sourceforge.net/下載proxool,釋放proxool.jar到WEB-INF/lib 

2)、在hibernate.cfg.xml中增加: 
<property name="hibernate.proxool.pool_alias">dbpool</property> 
<property name="hibernate.proxool.xml">proxool.xml</property> 
<property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property> 

3)、在與hibernate.cfg.xml同級目錄(src根目錄下)增加proxool.xml文件: 
<?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>dbpool</alias> 
    <!--proxool只能管理由自己產生的連接--> 
    <driver-url> 
      jdbc:mysql://127.0.0.1:3306/wlsh?characterEncoding=GBK&useUnicode=true&autoReconnect=true     </driver-url> 
    <driver-class>com.mysql.jdbc.Driver</driver-class> 
    <driver-properties> 
        <property name="user" value="root" /> 
        <property name="password" value="123456" /> 
    </driver-properties> 
    <!-- proxool自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閒的連接就馬上回收,超時的銷燬--> 
    <house-keeping-sleep-time>90000</house-keeping-sleep-time> 
    <!-- 最少保持的空閒連接數--> 
    <prototype-count>5</prototype-count> 
    <!-- 允許最大連接數,超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new-connections決定--> 
    <maximum-connection-count>100</maximum-connection-count> 
    <!-- 最小連接數--> 
    <minimum-connection-count>10</minimum-connection-count> 
</proxool> 
</something-else-entirely> 

4)、重起tomcat 

在 hibernate3.0中,已經不再支持dbcp了,hibernate的作者在hibernate.org中,明確指出在實踐中發現dbcp有 BUG,在某些種情會產生很多空連接不能釋放,所以拋棄了對dbcp的支持。proxool不少行家推薦使用.c3p0佔用資源比較大,效率也不高.