1. 程式人生 > >spring中dbcp、c3p0和proxool配置比較

spring中dbcp、c3p0和proxool配置比較

現在常用的開源資料連線池主要有c3p0、dbcp和proxool三種。
>>hibernate開發組推薦使用c3p0,spring開發組推薦使用dbcp (dbcp連線池有weblogic連線池同樣的問題,就是強行關閉連線或資料庫重啟後,無法reconnect ,告訴連線被重置,這個設定可以解決),hibernate in action推薦使用c3p0和proxool。

spring中配置dbcp資料來源,使用jar包commons-dbcp-1.4.jar、commons-pool-1.6.jar、commons-logging-1.1.3.jar,配置示例:
<!-- 配置dbcp資料來源 -->
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="${jdbc.driverClassName}"/>
	<property name="url" value="${jdbc.url}"/>
	<property name="username" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
	<!-- 池啟動時建立的連線數量 -->
	<property name="initialSize" value="5"/>
	<!-- 同一時間可以從池分配的最多連線數量。設定為0時表示無限制。 -->
	<property name="maxActive" value="30"/>
	<!-- 池裡不會被釋放的最多空閒連線數量。設定為0時表示無限制。 -->
	<property name="maxIdle" value="20"/>
	<!-- 在不新建連線的條件下,池中保持空閒的最少連線數。 -->
	<property name="minIdle" value="3"/>
	<!-- 設定自動回收超時連線 -->  
	<property name="removeAbandoned" value="true" />
	<!-- 自動回收超時時間(以秒數為單位) -->  
	<property name="removeAbandonedTimeout" value="200"/>
	<!-- 設定在自動回收超時連線的時候列印連線的超時錯誤  --> 
	<property name="logAbandoned" value="true"/>
	<!-- 等待超時以毫秒為單位,在丟擲異常之前,池等待連線被回收的最長時間(當沒有可用連線時)。設定為-1表示無限等待。  -->  
	<property name="maxWait" value="100"/>
	<property name="validationQuery"  value="SELECT COUNT(*) FROM DUAL" /> 
</bean>

BasicDataSource 相關的引數說明:
dataSource: 要連線的 datasource
defaultAutoCommit: 對於事務是否 autoCommit, 預設值為 true
defaultReadOnly: 對於資料庫是否只能讀取, 預設值為 false
driverClassName:連線資料庫所用的 JDBC Driver Class
maxActive: 可以從物件池中取出的物件最大個數,為0則表示沒有限制,預設為8
maxIdle: 最大等待連線中的數量,設 0 為沒有限制 (物件池中物件最大個數)
minIdle:物件池中物件最小個數
maxWait: 最大等待秒數, 單位為 ms, 超過時間會丟出錯誤資訊
password: 登陸資料庫所用的密碼
url: 連線資料庫的 URL
username: 登陸資料庫所用的帳號
validationQuery: 驗證連線是否成功, SQL SELECT 指令至少要返回一行
removeAbandoned: 是否自我中斷, 預設是 false
removeAbandonedTimeout: 幾秒後會自我中斷, removeAbandoned 必須為 true
logAbandoned: 是否記錄中斷事件, 預設為 false
minEvictableIdleTimeMillis:大於0 ,進行連線空閒時間判斷,或為0,對空閒的連線不進行驗證;預設30分鐘
timeBetweenEvictionRunsMillis:失效檢查執行緒執行時間間隔,如果小於等於0,不會啟動檢查執行緒,預設-1
testOnBorrow:取得物件時是否進行驗證,檢查物件是否有效,預設為false
testOnReturn:返回物件時是否進行驗證,檢查物件是否有效,預設為false
testWhileIdle:空閒時是否進行驗證,檢查物件是否有效,預設為false
initialSize:初始化執行緒數
validationQuery:用於驗證連線是否成功的查詢SQL語句,SQL語句必須至少要返回一行資料


spring中配置c3p0資料來源,所需jar包c3p0-0.9.1.jar,例項程式碼如下:

<!-- 配置c3p0資料來源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
	<property name="jdbcUrl" value="${jdbc.url}" />
	<property name="driverClass" value="${jdbc.driverClassName}" />
	<property name="user" value="${jdbc.username}" />
	<property name="password" value="${jdbc.password}" />
	<!--連線池中保留的最大連線數。Default: 15 -->
	<property name="maxPoolSize" value="100" />
	<!--連線池中保留的最小連線數。-->
	<property name="minPoolSize" value="1" />
	<!--初始化時獲取的連線數,取值應在minPoolSize與maxPoolSize之間。Default: 3 -->
	<property name="initialPoolSize" value="10" />
	<!--最大空閒時間,60秒內未使用則連線被丟棄。若為0則永不丟棄。Default: 0 -->
	<property name="maxIdleTime" value="30" />
	<!--當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。Default: 3 -->
	<property name="acquireIncrement" value="5" />
	<!--JDBC的標準引數,用以控制資料來源內載入的PreparedStatements數量。但由於預快取的statements
	  屬於單個connection而不是整個連線池。所以設定這個引數需要考慮到多方面的因素。
	  如果maxStatements與maxStatementsPerConnection均為0,則快取被關閉。Default: 0-->
	<property name="maxStatements" value="0" />
	 
	<!--每60秒檢查所有連線池中的空閒連線。Default: 0 -->
	<property name="idleConnectionTestPeriod" value="60" />
	 
	<!--定義在從資料庫獲取新連線失敗後重復嘗試的次數。Default: 30 -->
	<property name="acquireRetryAttempts" value="30" />
	
	<!--獲取連線失敗將會引起所有等待連線池來獲取連線的執行緒丟擲異常。但是資料來源仍有效
	  保留,並在下次呼叫getConnection()的時候繼續嘗試獲取連線。如果設為true,那麼在嘗試
	  獲取連線失敗後該資料來源將申明已斷開並永久關閉。Default: false-->
	<property name="breakAfterAcquireFailure" value="true" />
	 
	<!--因效能消耗大請只在需要的時候使用它。如果設為true那麼在每個connection提交的
	  時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
	  等方法來提升連線測試的效能。Default: false -->
	<property name="testConnectionOnCheckout"  value="false" />
<property name="validationQuery"  value="SELECT COUNT(*) FROM DUAL" />
</bean>
ComboPooledDataSource相關的引數說明:
acquireIncrement: 當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。Default: 3
acquireRetryAttempts: 定義在從資料庫獲取新連線失敗後重復嘗試的次數。Default: 30
acquireRetryDelay: 兩次連線中間隔時間,單位毫秒。Default: 1000
autoCommitOnClose: 連線關閉時預設將所有未提交的操作回滾。Defaul t: false
automaticTestTable: c3p0將建一張名為Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個引數那麼屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操作,它將只供c3p0測試使用。Default: null
breakAfterAcquireFailure: 獲取連線失敗將會引起所有等待連線池來獲取連線的執行緒丟擲異常。但是資料來源仍有效保留,並在下次呼叫getConnection()的時候繼續嘗試獲取連線。如果設為true,那麼在嘗試獲取連線失敗後該資料來源將申明已斷開並永久關閉。Default: false
checkoutTimeout:當連線池用完時客戶端呼叫getConnection()後等待獲取新連線的時間,超時後將丟擲SQLException,如設為0則無限期等待。單位毫秒。Default: 0
connectionTesterClassName: 通過實現ConnectionTester或QueryConnectionT ester的類來測試連線。類名需制定全路徑。Default: com.mchange.v2.c3p0.impl.Def aultConnectionTester
driverClass:連線資料庫所用的 JDBC Driver Class
factoryClassLocation: 指定c3p0 libraries的路徑,如果(通常都是這樣)在本地即可獲得那麼無需設定,預設null即可Default: null
idleConnectionTestPeriod: 每60秒檢查所有連線池中的空閒連線。Defaul t: 0
initialPoolSize: 初始化時獲取三個連線,取值應在minPoolSize與maxPoolSize之間。Default: 3
jdbcUrl:連線資料庫的 URL
maxIdleTime: 最大空閒時間,60秒內未使用則連線被丟棄。若為0則永不丟棄。Default: 0
maxPoolSize: 連線池中保留的最大連線數。Default: 15
maxStatements: JDBC的標準引數,用以控制資料來源內載入的PreparedSt atements數量。但由於預快取的statements屬於單個connection而不是整個連線池。所以設定這個引數需要考慮到多方面的因素。如果maxStatements與maxStatementsPerConnection均為0,則快取被關閉。Default: 0
maxStatementsPerConnection: maxStatementsPerConnection定義了連線池內單個連線所擁有的最大快取statements數。Default: 0
numHelperThreads:c3p0是非同步操作的,緩慢的JDBC操作通過幫助程序完成。擴充套件這些操作可以有效的提升效能通過多執行緒實現多個操作同時被執行。Default: 3
overrideDefaultUser:當用戶呼叫getConnection()時使root使用者成為去獲取連線的使用者。主要用於連線池連線非c3p0的資料來源時。Default: null
overrideDefaultPassword:與overrideDefaultUser引數對應使用的一個引數。Default: null
password:密碼。Default: null
user:使用者名稱。Default: null
preferredTestQuery:定義所有連線測試都執行的測試語句。在使用連線測試的情況下這個一顯著提高測試速度。注意:測試的表必須在初始資料來源的時候就存在。Default: null
propertyCycle:使用者修改系統配置引數執行前最多等待300秒。Defaul t: 300
testConnectionOnCheckout:因效能消耗大請只在需要的時候使用它。如果設為true那麼在每個connection提交的時候都將校驗其有效性。建議使用idleConnectio nTestPeriod或automaticTestTable等方法來提升連線測試的效能。Default: false
testConnectionOnCheckin:如果設為true那麼在取得連線的同時將校驗連線的有效性。Default: false

spring中proxool配置,所需jar包為jar包proxool-0.9.1.jar和proxool-cglib.jar,示例程式碼如下:
<pre name="code" class="sql"><bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
	<property name="driver" value="${jdbc.connection.driverClassName}"/>
	<property name="driverUrl" value="${jdbc.connection.url}"/>
	<property name="user" value="${jdbc.connection.username}"/>
	<property name="password" value="${jdbc.connection.password}"/>
	<!-- 最少保持的空閒連線數 (預設2個) -->
	 <property name="prototypeCount" value="${proxool.prototypeCount}"/>
	<!-- proxool自動偵察各個連線狀態的時間間隔(毫秒),偵察到空閒的連線就馬上回收,超時的銷燬 預設30秒) -->
	<property name="houseKeepingSleepTime" value="${proxool.hourseKeepingSleepTime}"/>
	<!-- 最大活動時間(超過此時間執行緒將被kill,預設為5分鐘) -->
	 <property name="maximumActiveTime" value="${proxool.maximumActiveTime}"/>
	<!-- 連線最長時間(預設為4個小時) -->
	<property name="maximumConnectionLifetime" value="${proxool.maximumConnectionLifetime}"/>
	<!-- 最小連線數 (預設2個) -->
	<property name="minimumConnectionCount" value="${proxool.minimumConnectionCount}"/>
	<!-- 最大連線數 (預設5個) -->
	<property name="maximumConnectionCount" value="${proxool.maximumConnectionCount}"/>
	<!-- -->
	<property name="statistics" value="${proxool.statistics}"/>
	<!-- 同時最大連線數 -->
	<property name="simultaneousBuildThrottle" value="${proxool.simultaneous-build-throttle}"/>
	<!-- 測試的SQL執行語句-->
	<property name="houseKeepingTestSql" value="select CURRENT_DATE"/>
 </bean>
ProxoolDataSource引數說明:
alias:資料來源的別名
driver-url:url連線串,須確定使用者名稱和密碼
driver-class:驅動名
username:使用者名稱(proxool沒有使用,但是不能沒有)
password:密碼(proxool沒有使用,但是不能沒有)
maximum-connection-count:最大連線數(預設5個),超過了這個連線數,再有請求時,就排在佇列中等候,最大的等待請求數由maximum-new-connections決定
minimum-connection-count:最小連線數(預設2個)
house-keeping-sleep-time:proxool自動偵察各個連線狀態的時間間隔(毫秒),偵察到空閒的連線就馬上回收,超時的銷燬 預設30秒)
prototype-count:最少保持的空閒連線數(預設2個)
maximum-new-connections:沒有空閒連線可以分配而在佇列中等候的最大請求數,超過這個請求數的使用者連線就不會被接受