spring配置datasource三種方式及具體信息

1、使用org.springframework.jdbc.datasource.DriverManagerDataSource
說明:DriverManagerDataSource建立連接是隻要有連接就新建一個connection,根本沒有連接池的作用。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
              <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
              <property name="url"><value>${jdbc.url}</value></property>
              <property name="username"><value>${jdbc.username}</value></property>

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

</bean>

2、使用org.apache.commons.dbcp.BasicDataSource
說明:這是一種推薦說明的數據源配置方式,它真正使用了連接池技術
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
              <property name="driverClassName">
                     <value>com.mysql.jdbc.Driver</value>
              </property>
              <property name="url">
                     <value>jdbc:mysql:thin:@localhost:3306:/OA</value>
              </property>
              <property name="username">
                     <value>test</value>
              </property>
              <property name="password">
                     <value>test</value>
              </property>
              <property name="maxActive">
                     <value>255</value>
              </property>
              <property name="maxIdle">
                     <value>2</value>
              </property>
              <property name="maxWait">
                     <value>120000</value>
              </property>
       </bean>
3、使用org.springframework.jndi.JndiObjectFactoryBean
說明:JndiObjectFactoryBean 能夠通過JNDI獲取DataSource
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
              <property name="jndiName"><value>Java:comp/env/jdbc/roseindiaDB_local</value></property>
       </bean>
總結:3種方式中的第一種沒有使用連接池,故少在項目中用到,第三種方式需要在web server中配置數據源,不方便於部署,本人推薦使用每二種方式進行數據源的配置。

配置一個數據源
    spring在第三方依賴包中包含了兩個數據源的實現類包,其一是Apache的DBCP,其二是 C3P0。可以在Spring配置文件中利用這兩者中任何一個配置數據源。


網址鏈接:http://blog.csdn.net/kunkun378263/article/details/8506355

第二種常用的配置詳細信息爲

  1. <!-- 數據源1 -->  
  2.     <bean id="dataSource"  
  3.           class="org.apache.commons.dbcp.BasicDataSource"  
  4.           destroy-method="close">  
  5.         <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
  6.         <property name="url" value="jdbc:mysql://192.168.0.109:3306/test?useUnicode=true&characterEncoding=UTF-8"/>  
  7.         <property name="username" value="root"/>  
  8.         <property name="password" value="root"/>  
  9.         <!--maxActive: 最大連接數量-->    
  10.         <property name="maxActive" value="150"/>  
  11.         <!--minIdle: 最小空閒連接-->    
  12.         <property name="minIdle" value="5"/>  
  13.         <!--maxIdle: 最大空閒連接-->    
  14.         <property name="maxIdle" value="20"/>  
  15.         <!--initialSize: 初始化連接-->    
  16.         <property name="initialSize" value="30"/>  
  17.         <!-- 連接被泄露時是否打印 -->  
  18.         <property name="logAbandoned" value="true"/>  
  19.         <!--removeAbandoned: 是否自動回收超時連接-->    
  20.         <property name="removeAbandoned"  value="true"/>  
  21.         <!--removeAbandonedTimeout: 超時時間(以秒數爲單位)-->    
  22.         <property name="removeAbandonedTimeout" value="10"/>  
  23.         <!--maxWait: 超時等待時間以毫秒爲單位 1000等於60秒-->  
  24.         <property name="maxWait" value="1000"/>  
  25.         <!-- 在空閒連接回收器線程運行期間休眠的時間值,以毫秒爲單位. -->  
  26.         <property name="timeBetweenEvictionRunsMillis" value="10000"/>  
  27.         <!--  在每次空閒連接回收器線程(如果有)運行時檢查的連接數量 -->  
  28.         <property name="numTestsPerEvictionRun" value="10"/>  
  29.         <!-- 1000 * 60 * 30  連接在池中保持空閒而不被空閒連接回收器線程-->  
  30.         <property name="minEvictableIdleTimeMillis" value="10000"/>  
  31.     <property name="validationQuery" value="SELECT NOW() FROM DUAL"/>  
  32.     </bean>  

下面的註釋爲轉來的。很詳細

 

tomcatde DHCP的配置
<Resource driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
logAbandoned="true" maxActive="20" maxIdle="2" maxWait="5000" name="system" 
removeAbandonedTimeout="60" removeAbandoned="true" 
password="xx" type="javax.sql.DataSource"
url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=base" 
username="sa"/>
當中的
logAbandoned="true"  removeAbandoned="true" removeAbandonedTimeout="60"
就是用來配置數據庫斷開後自動連接的。


數據庫連接池會在啓動時就建立所需的若干連接,並一直保持連接狀態,
但是當數據庫服務停止後,這些連接就被外部因素給中斷了
網上優化了的配置信息:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
<property name="driverClassName" value="${db.driverClassName}"/>  
<property name="url" value="${db.url}"/>  
<property name="username" value="${db.username}"/>  
<property name="password" value="${db.password}"/>  
<!--initialSize: 初始化連接-->  
<property name="initialSize" value="5"/>  
<!--maxIdle: 最大空閒連接-->  
<property name="maxIdle" value="10"/>  
<!--minIdle: 最小空閒連接-->  
<property name="minIdle" value="5"/>  
<!--maxActive: 最大連接數量-->  
<property name="maxActive" value="15"/>  
<!--removeAbandoned: 是否自動回收超時連接-->  
<property name="removeAbandoned" value="true"/>  
<!--removeAbandonedTimeout: 超時時間(以秒數爲單位)-->  
<property name="removeAbandonedTimeout" value="180"/>  
<!--maxWait: 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒-->  
<property name="maxWait" value="3000"/>  
<property name="validationQuery">  
<value>SELECT 1</value>  
</property>  
<property name="testOnBorrow">  
<value>true</value>  
</property>  
</bean>  

dbcp配置中文版本,自apache 官方文檔
原文請見http://commons.apache.org/dbcp/configuration.html。

參數  描述
username  傳遞給JDBC驅動的用於建立連接的用戶名
password  傳遞給JDBC驅動的用於建立連接的密碼
url  傳遞給JDBC驅動的用於建立連接的URL
driverClassName  使用的JDBC驅動的完整有效的java 類名
connectionProperties  當建立新連接時被髮送給JDBC驅動的連接參數,
格式必須是 [propertyName=property;]*
注意 :參數user/password將被明確傳遞,所以不需要包括在這裏。

參數  默認值  描述
defaultAutoCommit  true  連接池創建的連接的默認的auto-commit狀態
defaultReadOnly  driver default  連接池創建的連接的默認的read-only狀態. 
如果沒有設置則setReadOnly方法將不會被調用. (某些驅動不支持只讀模式,比如:Informix)
defaultTransactionIsolation  driver default  連接池創建的連接的默認的TransactionIsolation狀態. 
下面列表當中的某一個: (參考javadoc)

    * NONE
    * READ_COMMITTED
    * READ_UNCOMMITTED
    * REPEATABLE_READ
    * SERIALIZABLE

defaultCatalog   連接池創建的連接的默認的catalog

參數  默認值  描述
initialSize  0  初始化連接:連接池啓動時創建的初始化連接數量,1.2版本後支持
maxActive  8  最大活動連接:連接池在同一時間能夠分配的最大活動連接的數量, 
如果設置爲非正數則表示不限制
maxIdle  8  最大空閒連接:連接池中容許保持空閒狀態的最大連接數量,超過的空閒連接將被釋放,
如果設置爲負數表示不限制
minIdle  0  最小空閒連接:連接池中容許保持空閒狀態的最小連接數量,低於這個數量將創建新的連接,
如果設置爲0則不創建
maxWait  無限  最大等待時間:當沒有可用連接時,連接池等待連接被歸還的最大時間(以毫秒計數),
超過時間則拋出異常,如果設置爲-1表示無限等待

參數  默認值  描述
validationQuery   SQL查詢,用來驗證從連接池取出的連接,在將連接返回給調用者之前.如果指定,
則查詢必須是一個SQL SELECT並且必須返回至少一行記錄
testOnBorrow  true  指明是否在從池中取出連接前進行檢驗,如果檢驗失敗,
則從池中去除連接並嘗試取出另一個.
注意: 設置爲true後如果要生效,validationQuery參數必須設置爲非空字符串
testOnReturn  false  指明是否在歸還到池中前進行檢驗
注意: 設置爲true後如果要生效,validationQuery參數必須設置爲非空字符串
testWhileIdle  false  指明連接是否被空閒連接回收器(如果有)進行檢驗.如果檢測失敗,
則連接將被從池中去除.
注意: 設置爲true後如果要生效,validationQuery參數必須設置爲非空字符串
timeBetweenEvictionRunsMillis  -1  在空閒連接回收器線程運行期間休眠的時間值,以毫秒爲單位.
 如果設置爲非正數,則不運行空閒連接回收器線程
numTestsPerEvictionRun  3  在每次空閒連接回收器線程(如果有)運行時檢查的連接數量
minEvictableIdleTimeMillis  1000 * 60 * 30  連接在池中保持空閒而不被空閒連接回收器線程
(如果有)回收的最小時間值,單位毫秒

參數  默認值  描述
poolPreparedStatements  false  開啓池的prepared statement 池功能
maxOpenPreparedStatements  不限制  statement池能夠同時分配的打開的statements的最大數量, 
如果設置爲0表示不限制


這裏可以開啓PreparedStatements池. 當開啓時, 將爲每個連接創建一個statement池,
並且被下面方法創建的PreparedStatements將被緩存起來:
    * public PreparedStatement prepareStatement(String sql)
    * public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
注意: 確認連接還有剩餘資源可以留給其他statement
參數  默認值  描述
accessToUnderlyingConnectionAllowed  false  控制PoolGuard是否容許獲取底層連接


如果容許則可以使用下面的方式來獲取底層連接:
    Connection conn = ds.getConnection();
    Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();
    ...
    conn.close();

默認false不開啓, 這是一個有潛在危險的功能, 不適當的編碼會造成傷害.
(關閉底層連接或者在守護連接已經關閉的情況下繼續使用它).請謹慎使用,
並且僅當需要直接訪問驅動的特定功能時使用.
注意: 不要關閉底層連接, 只能關閉前面的那個.
參數  默認值  描述
removeAbandoned  false  標記是否刪除泄露的連接,如果他們超過了removeAbandonedTimout的限制.
如果設置爲true, 連接被認爲是被泄露並且可以被刪除,如果空閒時間超過removeAbandonedTimeout. 
設置爲true可以爲寫法糟糕的沒有關閉連接的程序修復數據庫連接.
removeAbandonedTimeout  300  泄露的連接可以被刪除的超時值, 單位秒
logAbandoned  false  標記當Statement或連接被泄露時是否打印程序的stack traces日誌。
被泄露的Statements和連接的日誌添加在每個連接打開或者生成新的Statement,
因爲需要生成stack trace。


如果開啓"removeAbandoned",那麼連接在被認爲泄露時可能被池回收. 這個機制在(getNumIdle() < 2)
 and (getNumActive() > getMaxActive() - 3)時被觸發.
舉例當maxActive=20, 活動連接爲18,空閒連接爲1時可以觸發"removeAbandoned".
但是活動連接只有在沒有被使用的時間超過"removeAbandonedTimeout"時才被刪除,默認300秒.
在resultset中游歷不被計算爲被使用.

鏈接:http://www.cnblogs.com/adolfmc/archive/2013/01/22/2872298.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章