hibernate cp30和dbcp配置加jidn配置

spring 中數據源和數據庫鏈接池配置的幾種方法java

1、           數據源的配置:mysql

*    與 hibernate 集成最多見的一種:web

<!-- 配置 sessionFactory -->算法

       < bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >spring

              < property name = "configLocation" >sql

                     < value > classpath:hibernate.cfg .xml </ value >數據庫

              </ property >apache

              <!-- < property name = "configLocation" value = "classpath:hibernate.cfg.xml" >緩存

              </ property > -->服務器

       </ bean >      

      

       <!-- 配置事務管理器 -->   

       < bean id = "transactionManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager" >

              < property name = "sessionFactory" >

                     < ref local = "sessionFactory" />

              </ property >

       </ bean >

*    DataSource 單獨配置:

  < bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" >

          < property name = "driverClassName" value = "com.MySQL.jdbc.Driver" />

              < property name = "url" value = "jdbc:mysql://127.0.0.1/test" />

              < property name = "username" value = "root" />

              < property name = "password" value = "root" />

    </ bean >

   

       <!-- 配置 sessionFactory -->

       < bean id = "sessionFactory" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >

              < property name = "dataSource" ref = "dataSource" ></ property >

              < property name = "configLocation" value = "classpath:hibernate.cfg.xml" >

              </ property >

       </ bean >      

      

       <!-- 配置事務管理器 -->   

       < bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" >

       < property name = "dataSource" >

              < ref local = "dataSource" />

       </ property >

              <!--<property name="sessionFactory">

                     <ref local="sessionFactory"/>

              </property>

       --> </ bean >

*取消掉 hibernate.cfg.xml 的配置文件直接配置在 Spring 中

<!-- 配置 sessionFactory -->

       <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

              <property name="dataSource" ref="dataSource"/>

              <property name="hibernateProperties">

                     <props>

                            <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>

                            <prop key="hibernate.hbm2ddl.auto">true</prop>

                            <prop key="hibernate.show_sql">true</prop>

                     </props>

              </property>

              <property name="mappingResources">

                     <list>

                            <value>com/bjsxt/model/Dictionary.hbm.xml</value>

                            <value>com/bjsxt/model/User.hbm.xml</value>

                            <value>com/bjsxt/model/Customer.hbm.xml</value>

                            <value>com/bjsxt/model/ContactPerson.hbm.xml</value>

                     </list>

              </property>

              <!--<property name="configLocation">

                     <value>classpath:hibernate.cfg.xml</value>

              </property>

       --></bean>

       <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

              <property name="dataSource">

                     <ref local="dataSource"/>

              </property>

       </bean>

2、           數據庫鏈接池的配置 :

在傳統的兩層結構中,客戶端程序在啓動時打開數據庫鏈接,在退出程序時關閉數據庫鏈接。這樣,在整個程序運行中,每一個客戶端始終佔用一個數據庫鏈接,即便在大量沒有數據庫操做的空閒時間,如用戶輸入數據時,從而形成數據庫鏈接的使用效率低下。

在三層結構模式中,數據庫鏈接經過中間層的鏈接池管理。只有當用戶真正須要進行數據庫操做時,中間層才從鏈接池申請一個鏈接,數據庫操做完畢,鏈接當即釋放到鏈接池中,以供其餘用戶使用。這樣,不只大大提升了數據庫鏈接的使用效率,使得大量用戶能夠共享較少的數據庫鏈接,並且省去了創建鏈接的時間。

 

關於數據庫鏈接池幾個屬性的說明 :

△        最小鏈接數是鏈接池一直保持的數據庫鏈接,因此若是應用程序對數據庫鏈接的使用量不大,將會有大量的數據庫鏈接資源被浪費;

△        最大鏈接數是鏈接池能申請的最大鏈接數,若是數據庫鏈接請求超過此數,後面的數據庫鏈接請求將被加入到等待隊列中,這會影響以後的數據庫操做。

△        若是最小鏈接數與最大鏈接數相差太大,那麼最早的鏈接請求將會獲利,以後超過最小鏈接數量的鏈接請求等價於創建一個新的數據庫鏈接。不過,這些大於最小鏈接數的數據庫鏈接在使用完不會立刻被釋放,它將被放到鏈接池中等待重複使用或是空閒超時後被釋放。

Xml 代碼

1.      <!-- JDBC 驅動程序 -->   

2.      <property name = "connection.driver_class" com.mysql.jdbc.Driver </property>

3.      <property name = "connection.url" jdbc:mysql://localhost:3306/struts? useUnicode = true & characterEncoding = GBK</property> <!-- 數據庫用戶名 -->   

1.      <property name = "connection.username" root </property> <!-- 數據庫密碼 -->   

2.      <property name = "connection.password" 8888 </property>    

上面的一段配置,在 c3p0 和 dbcp 中,都是必需的,由於 hibernate 會根據上述的配置來生成 connections ,再交給 c3p0 或 dbcp 管理 .

1 C3P0 

只需在 hibernate.cfg.xml 中加入

Xml 代碼

1.      <property name = " c3p0.min_size" </property>   

2.      <property name = " c3p0.max_size" 30 </property>   

3.      <property name = " c3p0.time_out" 1800 </property>   

4.      <property name = " c3p0.max_statement" 50 </property>    

還有在 classespath 中加入 c3p0-0.8.4.5.jar

2 dbcp 

在 hibernate.cfg.xml 中加入

Xml 代碼

1.      <property name = " dbcp.maxActive" 100 </property>   

2.      <property name = " dbcp.whenExhaustedAction" </property>   

3.      <property name = " dbcp.maxWait" 60000 </property>   

4.      <property name = " dbcp.maxIdle" 10 </property>   

5.        

6.      <property name = " dbcp.ps.maxActive" 100 </property>   

7.      <property name = " dbcp.ps.whenExhaustedAction" </property>   

8.      <property name = " dbcp.ps.maxWait" 60000 </property>   

9.      <property name = " dbcp.ps.maxIdle" 10 </property>   

還有在 classespath 中加入 commons-pool-1.2.jar 和 commons-dbcp-1.2.1.jar.

3) proxool

在 hibernate.cfg.xml 中增長:

Xml 代碼

1.      <property name = "hibernate.proxool.pool_alias" dbpool </property>   

2.      <property name = "hibernate.proxool.xml" proxool.xml </property>   

3.      <property name = "connection.provider_class" org.hibernate.connection.ProxoolConnectionProvider </property>   

3) 、在與 hibernate.cfg.xml 同級目錄( src 根目錄下)增長 proxool.xml 文件:

Xml 代碼

1.      <?xml version = "1.0" encoding = "utf-8" ?>   

2.      <!-- the proxool configuration can be embedded within your own application's.   

3.      Anything outside the "proxool" tag is ignored. --   

4.      <something-else-entirely>   

5.      <proxool>   

6.          <alias> dbpool </alias>   

7.          <!--proxool 只能管理由本身產生的鏈接 -->   

8.          <driver-url>   

9.            jdbc:mysql://127.0.0.1:3306/wlsh? characterEncoding = GBK & useUnicode = true & autoReconnect = true      </driver-url>   

10.     <driver-class> com.mysql.jdbc.Driver </driver-class>   

11.     <driver-properties>   

12.         <property name = "user" value = "root" />   

13.         <property name = "password" value = "123456" />   

14.     </driver-properties>   

15.     <!-- proxool 自動偵察各個鏈接狀態的時間間隔 ( 毫秒 ), 偵察到空閒的鏈接就立刻回收 , 超時的銷燬 -->   

16.     <house-keeping-sleep-time> 90000 </house-keeping-sleep-time>   

17.     <!-- 最少保持的空閒鏈接數 -->   

18.     <prototype-count> </prototype-count>   

19.     <!-- 容許最大鏈接數 , 超過了這個鏈接,再有請求時,就排在隊列中等候,最大的等待請求數由 maximum-new-connections決定 -->   

20.     <maximum-connection-count> 100 </maximum-connection-count>   

21.     <!-- 最小鏈接數 -->   

22.     <minimum-connection-count> 10 </minimum-connection-count>   

23. </proxool>   

24. </something-else-entirely>   


於在 hibernate3.0 中,已經再也不支持 dbcp 了, hibernate 的做者在 hibernate.org 中,明確指出在實踐中發現 dbcp 有 BUG, 在某些種情會產生不少空鏈接不能釋放,因此拋棄了對 dbcp 的支持。至於 c3p0 ,有評論說它的算法不是最優的,由於網上查資料得知:有網友作了一個實驗,在同一項目中分別用了幾個經常使用的鏈接池,而後測試其性能,發現 c3p0 佔用資源 比較 大,效率也不高。因此,基於上述緣由, proxool 很多行家推薦使用,並且暫時來講,是負面評價是最少的一個。在三星中也有項目是用 proxool 的。 從性能和出錯率來講, proxool 稍微比前兩種好些。 C3P0 ,穩定性彷佛不錯,在這方面彷佛有很好的口碑。至於 性能 ,應該不是最好的,算是中規中矩的類型。 
   Proxool 的口碑彷佛很好,不大見到負面的評價,從官方資料上來看,有許多有用的特性和特色,也是許多人推薦的。

 

 

4 . JNDI 鏈接池 ,數據源已經由應用服務配置好 ( 如 Web 服務器 ) , Hibernate 須要作的只是經過 JNDI 名查找到此數據源。應用服務器將鏈接池對外顯示爲 JNDI 綁定數據源,它是 javax.jdbc.Datasource 類的一個實例。只要配置一個 Hibernate 文件,如: 

hibernate.connection.datasource=Java:/comp/env/jdbc/schoolproject //JNDI 名 

hibernate.transaction.factory_class = net.sf.hibernate.transaction.JTATransactionFactory 

hibernate.transaction.manager_loopup_class = 

org.hibernate.transaction.JBossTransactionManagerLookup 

hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect

一樣咱們能夠把上面的代碼配置到 Spring 中:

1 dbcp

< bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" >

          < property name = "driverClassName" value = "com.mysql.jdbc.Driver" />

              < property name = "url" value = "jdbc:mysql://127.0.0.1/test" />

              < property name = "username" value = "root" />

              < property name = "password" value = "root" />

              < property name = "maxActive" value = "80" />

              < property name = "maxIdle" value = "20" />

              < property name = "maxWait" value = "3000" />

</ bean >

3.      c3p0

<!-- close() 方法,確保在 spring 容器關閉時數據源可以成功釋放 -->

       < bean id = "dataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" >

              < property name = "driverClass" value = "com.mysql.jdbc.Driver" />

              < property name = "jdbcUrl" value = "jdbc:mysql://127.0.0.1/test" />

              < property name = "user" value = "root" />

              < property name = "password" value = "root" />

             

              <!-- 當鏈接池中的鏈接用完時, c3p0 一次性建立鏈接的數目 -->

              < property name = "acquireIncrement" value = "5" />

             

              <!-- 定義從數據庫獲取新鏈接失敗後重復嘗試獲取鏈接的次數,默認爲 30 -->

              < property name = "acquireRetryAttempts" value = "30" />

             

              <!-- 定義兩次鏈接中間隔的時間,單位毫秒,默認爲 1000 -->

              < property name = "acquireRetryDelay" value = "1000" />

              < property name = "idleConnectionTestPeriod" value = "3000" />

             

              <!-- 當鏈接池用完時客戶端調用 getConnection() 後等待獲取新鏈接的時間,

              超時後將拋出 SQLException ,如設爲 0 則無限期等待。單位毫秒,默認爲 0 ;   -->

              < property name = "checkoutTimeout"   value = "3000" />

              < property name = "maxPoolSize" value = "80" />

              < property name = "minPoolSize" value = "1" />

             

              <!-- JDBC 的標準參數,用以控制數據源內加載的 PreparedStatement 數量。

              但因爲預緩存的 Statement 屬 於單個 Connection 而不是整個鏈接池。

              因此設置這個參數須要考慮到多方面的因素,若是 maxStatements 與

              maxStatementsPerConnection 均爲 0 ,則緩存被關閉。默認爲 0 ;

                -->

              < property name = "maxStatements" value = "6000" />

              < property name = "initialPoolSize" value = "5" />

             

</ bean >

注:其餘參數的意義;

  C3P0 擁有比 DBCP 更豐富的配置屬性,經過這些屬性,能夠對數據源進行各類有效的控制:  
    acquireIncrement :當鏈接池中的鏈接用完時, C3P0 一次性建立新鏈接的數目;  
    acquireRetryAttempts :定義在從數據庫獲取新鏈接失敗後重復嘗試獲取的次數,默認爲 30 ;  
    acquireRetryDelay :兩次鏈接中間隔時間,單位毫秒,默認爲 1000 ;  
    autoCommitOnClose :鏈接關閉時默認將全部未提交的操做回滾。默認爲 false ;  
    automaticTestTable :  C3P0 將建一張名爲 Test 的空表,並使用其自帶的查詢語句進行測試。若是定義了這個參數,那麼屬性preferredTestQuery 將被忽略。你   不能在這張 Test 表上進行任何操做,它將中爲 C3P0 測試所用,默認爲 null ;  
    breakAfterAcquireFailure :獲取鏈接失敗將會引發全部等待獲取鏈接的線程拋出異常。可是數據源仍有效保留,並在下次調    用 getConnection() 的時候繼續嘗試獲取鏈接。若是設爲 true ,那麼在嘗試獲取鏈接失敗後該數據源將申明已斷開並永久關閉。默認爲  false ;  
    checkoutTimeout :當鏈接池用完時客戶端調用 getConnection() 後等待獲取新鏈接的時間,超時後將拋出 SQLException ,如設爲 0 則無限期等待。單位毫秒,默認爲 0 ;  
    connectionTesterClassName :   經過實現 ConnectionTester 或 QueryConnectionTester 的類來測試鏈接,類名需設置爲全限定名。默認爲  com.mchange.v2.C3P0.impl.DefaultConnectionTester ;  
    idleConnectionTestPeriod :隔多少秒檢查全部鏈接池中的空閒鏈接,默認爲 0 表示不檢查;  
    initialPoolSize :初始化時建立的鏈接數,應在 minPoolSize 與 maxPoolSize 之間取值。默認爲 3 ;  
    maxIdleTime :最大空閒時間,超過空閒時間的鏈接將被丟棄。爲 0 或負數則永不丟棄。默認爲 0 ;  
    maxPoolSize :鏈接池中保留的最大鏈接數。默認爲 15 ;  
    maxStatements : JDBC 的標準參數,用以控制數據源內加載的 PreparedStatement 數量。但因爲預緩存的 Statement 屬   於單個 Connection 而不是整個鏈接池。因此設置這個參數須要考慮到多方面的因素,若是 maxStatements 與 maxStatementsPerConnection 均爲 0 ,則緩存被關閉。默認爲 0 ;  
    maxStatementsPerConnection :鏈接池內單個鏈接所擁有的最大緩存 Statement 數。默認爲 0 ;  
    numHelperThreads : C3P0 是異步操做的,緩慢的 JDBC 操做經過幫助進程完成。擴展這些操做能夠有效的提高性能,經過多線程實現多個操做同時被執行。默認爲 3 ;  
    preferredTestQuery :定義全部鏈接測試都執行的測試語句。在使用鏈接測試的狀況下這個參數能顯著提升測試速度。測試的表必須在初始數據源的時候就存在。默認爲 null ;  
    propertyCycle :   用戶修改系統配置參數執行前最多等待的秒數。默認爲 300 ;  
    testConnectionOnCheckout :因性能消耗大請只在須要的時候使用它。若是設爲 true 那麼在每一個 connection 提交的時候都  將校驗其有效性。建議使用 idleConnectionTestPeriod 或 automaticTestTable 
等方法來提高鏈接測試的性能。默認爲 false ;  
    testConnectionOnCheckin :若是設爲 true 那麼在取得鏈接的同時將校驗鏈接的有效性。默認爲 false 。  

4.      proxool

< bean id = "dataSource" class = "org.logicalcobwebs.proxool.ProxoolDataSource" >

       < property name = "driver" value = "com.mysql.jdbc.Driver" />

       <!-- 用戶名,密碼寫在 url 中,屬性之間用 &amp; (此處爲轉義字符)隔開 -->

       < property name = "driverUrl" value = "jdbc:mysql://127.0.0.1/test?user=root&amp;password=root&amp;

                                   useUnicode=true&amp;characterEncoding=gbk&amp;autoReconnect=true&amp;

                                   failOverReadOnly=false" />       

                                  

              <!--  此處用戶名可不寫,但屬性必須存在 -->                   

       < property name = "user" value = "" />

      

       <!-- 此處密碼可不寫,但密碼屬性必須存在 -->

       < property name = "password" value = "" />

      

       <!-- 數據源的別名   -->

          < property name = "alias" value = "test" />

             

              <!-- proxool 自動偵察各個鏈接狀態的時間間隔 ( 毫秒 ), 偵察到空閒的鏈接就立刻回收 , 超時的銷燬 默認 30 秒)

                -->

          < property name = "houseKeepingSleepTime" value = "30000" />

         

          <!--   最少保持的空閒鏈接數 (默認 2 個)

           -->

          < property name = "prototypeCount" value = "2" />

         

          <!-- 最大鏈接數 (默認 5 個) -->

          < property name = "maximumConnectionCount" value = "5" />

         

          <!-- 最小鏈接數 (默認 2 個) -->

          < property name = "minimumConnectionCount" value = "2" />

         

          < property name = "trace" value = "true" />

          < property name = "verbose" value = "true" />

             

</ bean >

 

Spring 的數據源實現類  
    Spring 自己也提供了一個簡單的數據源實現類 DriverManagerDataSource  ,它位於 org.springframework.jdbc.datasource 包中。這個類實現了 javax.sql.DataSource 接口,但   它並無提供池化鏈接的機制,每次調用 getConnection() 獲取新鏈接時,只是簡單地建立一個新的鏈接。所以,這個數據源類比較適合在單元測試   或簡單的獨立應用中使用,由於它不須要額外的依賴類。 
      下面,咱們來看一下 DriverManagerDataSource 的簡單使用:固然,咱們也能夠經過配置的方式直接使用DriverManagerDataSource 。

經過配置文件:

讀配置文件的方式引用屬性:  

view plain copy to clipboard print ?

1.       <bean   id = "propertyConfigurer"          

2.       class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"           

3.            <property   name = "location"   value = "/WEB-INF/jdbc.properties" />           

4.       </bean>           

5.       <bean   id = "dataSource"   class = "org.apache.commons.dbcp.BasicDataSource"            

6.                destroy-method = "close"           

7.            <property   name = "driverClassName"   value = "${jdbc.driverClassName}"   />           

8.            <property   name = "url"   value = "${jdbc.url}"   />           

9.            <property   name = "username"   value = "${jdbc.username}"   />           

10.        <property   name = "password"   value = "${jdbc.password}"   />           

11.   </bean>       

 

 

 
     在 jdbc.properties 屬性文件中定義屬性值:  
   jdbc.driverClassName= com.mysql.jdbc.Driver 
    jdbc.url= jdbc:mysql://localhost:3309/sampledb 
    jdbc.username=root 
    jdbc.password=1234 

經過 jndi

< bean id = "dataSource" class = "org.springframework.jndi.JndiObjectFactoryBean" >

                 < property name = "jndiName" value = "java:comp/env/jdbc/bbt" />

           </ bean >

相關文章
相關標籤/搜索