asdtiang的博客 感謝blogjava提供的博客交流平臺

          hibernate 連接池 轉(zhuǎn)

          Posted on 2010-01-12 18:00 asdtiang 閱讀(2128) 評論(0)  編輯  收藏 所屬分類: Hibernate study
          轉(zhuǎn)載:Hibernate的三種連接池設(shè)置C3P0、Proxool和DBCP

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

          <!-- JDBC驅(qū)動程序 -->
          <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ù)庫用戶名 -->
          <property name="connection.username">root</property> <!-- 數(shù)據(jù)庫密碼 -->
          <property name="connection.password">8888</property>

          上面的一段配置,在c3p0和dbcp中,都是必需的,因為hibernate會根據(jù)上述的配置來生成connections,再交給c3p0或dbcp 管理.但是,proxool則不能,雖然說服文檔上說proxool也可以和hibernate結(jié)合,但我按照官方文檔上的說明怎么配也出錯,而且,到了 sun和hibernat有的官方網(wǎng)站上問了幾天,都沒有一個人回復。后來我只能讓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

          在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同一個目錄下,加一個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自動偵察各個連接狀態(tài)的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀-->
          <house-keeping-sleep-time>90000</house-keeping-sleep-time>
          <!-- 指因未有空閑連接可以分配而在隊列中等候的最大請求數(shù),超過這個請求數(shù)的用戶連接就不會被接受-->
          <maximum-new-connections>20</maximum-new-connections>
          <!-- 最少保持的空閑連接數(shù)-->
          <prototype-count>5</prototype-count>
          <!-- 允許最大連接數(shù),超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數(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中,明確指出在實踐中發(fā)現(xiàn)dbcp有 BUG,在某些種情會產(chǎn)生很多空連接不能釋放,所以拋棄了對dbcp的支持。我不知是否在dbcp最新版本中解決了這個問題,我以前在一個訪問量不大的項 目中用過dbcp,運行了一年多都沒出現(xiàn)問題。不過在網(wǎng)上的確也有不少網(wǎng)友指出dbcp在大型的應(yīng)用中會出現(xiàn)不穩(wěn)定的情況。所以在真相未經(jīng)證實的情況下, 我覺得對dbcp持慎重的態(tài)度。

          至于c3p0,有評論說它的算法不是最優(yōu)的,而且,我在matrix中,見到有網(wǎng)友做了一個實驗,在同一項目中分別用了幾個常用的連接池,然后測試其性 能,發(fā)現(xiàn)c3p0占用資源比較大,效率也不高。

          所以,基于上述原因,我才花兩晚的時間去研究proxool的配置,proxool不少行家推薦使用,而且暫時來說,是負面評價是最少的一個。在三星中也 有項目是用proxool的。
          Hibernate支持DBCP包進行數(shù)據(jù)庫連接池的配置。簡要說明配置過程:
          (僅僅是個人摸索,如有問題,歡迎指點)
          需要的包:
          Commons-Pool (下載地址:http://jakarta.apache.org/commons/pool/) :提供一個一般對象池的接口,而且包含實現(xiàn)了通常池工具箱。
          Commons-DBCP(下載地址:http://jakarta.apache.org/commons/dbcp/) :提供數(shù)據(jù)庫連接池服務(wù)。DBCP很聰明,把Commons-Pool和JDBC的driver封裝起來,使達到連接池的目的。

          Hibernate屬性文件的配置參數(shù)
          #連接池的最大活動個數(shù)
          hibernate.dbcp.maxActive 100
          #當連接池中的連接已經(jīng)被耗盡的時候,DBCP將怎樣處理( 0 = 失敗, 1 = 等待, 2= 增長)
          hibernate.dbcp.whenExhaustedAction 1
          #最大等待時間
          hibernate.dbcp.maxWait 120000
          #沒有人用連接的時候,最大閑置的連接個數(shù)。
          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已經(jīng)實現(xiàn)了DBCP Provider實現(xiàn),別忘了在下面的鍵值去掉#字符
          hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider


          天蒼蒼,野茫茫,風吹草底見牛羊

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           

          posts - 80, comments - 24, trackbacks - 0, articles - 32

          Copyright © asdtiang

          asdtiang的博客 PaidMailz
          點擊廣告網(wǎng)賺A(每天4個廣告,每個0.0025美元,一個搜索廣告0.03美元)
          主站蜘蛛池模板: 岳西县| 六枝特区| 嫩江县| 枣庄市| 仙游县| 定远县| 镇巴县| 邹平县| 察隅县| 镇沅| 姜堰市| 罗甸县| 天水市| 兴山县| 潮州市| 大厂| 壤塘县| 高雄市| 朔州市| 博客| 新疆| 手游| 马龙县| 崇左市| 平邑县| 绥化市| 凤山市| 从化市| 新野县| 喀什市| 贵定县| 香港 | 慈利县| 治多县| 灌阳县| 灵丘县| 尉氏县| 夏河县| 于田县| 汽车| 花莲县|