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" > 5 </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" > 1 </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" > 1 </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> 5 </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 中,屬性之間用 & (此處爲轉義字符)隔開 -->
< property name = "driverUrl" value = "jdbc:mysql://127.0.0.1/test?user=root&password=root&
useUnicode=true&characterEncoding=gbk&autoReconnect=true&
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 >