Spring的數據源配置 DBCP、C3P0、JNDI

Spring建議使用的數據源有Apache的DBCP,和C3P0。

如果使用高性能的應用服務器(WebLogic\WebSphere),可以使用JNDI數據源。

1. Apache-DBCP

DBCP依賴commons-pool對象池。所以需要的jar包有:commons-dbcp.jar,commons-pool.jar

DBCP的BasicDataSource提供了close()方法,所以在XML配置文件中須要指定destroy-method="close",以便Spring關閉時能正常關閉數據源。

新的DBCP 1.4性能不錯,相比1.2有了很大提高。

 

基本參數 :

 

參數 默認值 描述
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中游歷不被計算爲被使用.

 

 

2. C3P0

 

<c3p0-config>
<default-config>
<!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 -->
<property name="acquireIncrement">3</property>

<!--定義在從數據庫獲取新連接失敗後重復嘗試的次數。Default: 30 -->
<property name="acquireRetryAttempts">30</property>

<!--兩次連接中間隔時間,單位毫秒。Default: 1000 -->
<property name="acquireRetryDelay">1000</property>

<!--連接關閉時默認將所有未提交的操作回滾。Default: false -->
<property name="autoCommitOnClose">false</property>

<!--c3p0將建一張名爲Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個參數那麼
屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操作,它將只供c3p0測試
使用。Default: null-->
<property name="automaticTestTable">Test</property>

<!--獲取連接失敗將會引起所有等待連接池來獲取連接的線程拋出異常。但是數據源仍有效
保留,並在下次調用getConnection()的時候繼續嘗試獲取連接。如果設爲true,那麼在嘗試
獲取連接失敗後該數據源將申明已斷開並永久關閉。Default: false-->
<property name="breakAfterAcquireFailure">false</property>

<!--當連接池用完時客戶端調用getConnection()後等待獲取新連接的時間,超時後將拋出
SQLException,如設爲0則無限期等待。單位毫秒。Default: 0 -->
<property name="checkoutTimeout">100</property>

<!--通過實現ConnectionTester或QueryConnectionTester的類來測試連接。類名需制定全路徑。
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->
<property name="connectionTesterClassName"></property>

<!--指定c3p0 libraries的路徑,如果(通常都是這樣)在本地即可獲得那麼無需設置,默認null即可
Default: null-->
<property name="factoryClassLocation">null</property>

<!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.
(文檔原文)作者強烈建議不使用的一個屬性-->
<property name="forceIgnoreUnresolvedTransactions">false</property>

<!--每60秒檢查所有連接池中的空閒連接。Default: 0 -->
<property name="idleConnectionTestPeriod">60</property>

<!--初始化時獲取三個連接,取值應在minPoolSize與maxPoolSize-->


3.BoneCP 連接池

 

 <!-- 數據源    BoneCP 連接池 -->
 <bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.0.6:1521:orcl" />
    <property name="username" value="zfba"/>
    <property name="password" value="zfba"/>
    <property name="idleConnectionTestPeriod" value="60"/><!--檢查數據庫連接池中空閒連接的間隔時間,單位是分,默認值:240,如果要取消則設置爲0-->
    <property name="idleMaxAge" value="60"/><!--連接池中未使用的鏈接最大存活時間,單位是分,默認值:60,如果要永遠存活設置爲0-->
    <property name="maxConnectionsPerPartition" value="10"/><!--每個分區最大的連接數 -->
    <property name="minConnectionsPerPartition" value="1"/><!--每個分區最小的連接數 -->
    <property name="partitionCount" value="1"/><!--分區數,默認值2,最小1,推薦3-4,視應用而定  -->
    <property name="acquireIncrement" value="2"/><!-- 當連接池中的連接耗盡的時候一次同時獲取的連接數。Default: 1 -->
    <property name="statementsCacheSize" value="10"/><!--緩存prepared statements的大小,默認值:0 -->
    <property name="releaseHelperThreads" value="3"/><!--每個分區釋放鏈接助理進程的數量,默認值:3 -->
 </bean>


4.JNDI數據源

 

<bean id="datasource" class="org.springframework.jndiObjectFactoryBean" p:jndiName="java:comp/env/jdbc/名稱"/>

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