2013-02-13 114 views
3

現在我已經在網上搜索了一段時間四周,我還沒有解決這個問題:彈簧連接池的配置

我有以下數據源配置:

<bean id="cpms.prod.ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> 
    <property name="url"><value>jdbc:mysql://localhost/mysql</value></property> 
    <property name="username"><value>test</value></property> 
    <property name="password"><value>test</value></property> 
    <property name="initialSize" value="1" /> 
    <property name="maxActive" value="2" /> 
    <property name="maxIdle" value="1"></property> 
</bean> 

這應該是足以確保一個點上只有2個活動連接,並且這些連接用於池。

在我的java代碼中,我使用SimpleJdbcTemplate來做三個查詢,據我所知,這個對象應該在每個查詢結束後返回連接池,也應該阻止第三個查詢,而其他查詢之一結束。

在查看我的數據庫管理控制檯時,看到3個連接出現,然後切換到睡眠狀態。如果我再次運行查詢,我會看到另外3個連接彈出窗口,另外3個連接窗口停留在那裏

我已經找到了被關閉的連接的唯一方法是通過設置:

<property name="removeAbandoned" value="true"/> 
<property name="removeAbandonedTimeout" value="1"/> 

<property name="minIdle" value="0"></property> 
<property name="timeBetweenEvictionRunsMillis" value="1000"></property> 
<property name="minEvictableIdleTimeMillis" value="1000"></property> 

迫使放棄了連接過程運行和清理舊的連接。

我不應該插手這些參數,特別是不要將它們設置得太低,因爲它可能會有性能問題。

我也試過here顯示的解決方案,直到我將timeBetweenEvictionRunsMillisminEvictableIdleTimeMillis更改爲較低的值。並且它仍然不會將連接限制爲2.

+0

明顯的完整性檢查 - 您的JDBCTemplate實際上使用'cpms.prod.ds'作爲數據源,對嗎? – AngerClown 2013-02-14 00:32:02

+0

是的,它是唯一可用的數據源 – 2013-02-14 07:54:52

+0

apache-common-dbcp使用的是哪個版本?早期版本中存在minIdle 0問題https://issues.apache.org/jira/browse/DBCP-379 – 2013-06-19 07:26:54

回答

0

JdbcTemplate中的所有連接均通過DataSourceUtils.doGetConnection。你們看到的可能在BasicDataSource

是由於 '情報' 從API:

Abandonded connections are identified and removed when getConnection() is invoked and the following conditions hold

  • getRemoveAbandoned() = true
  • getNumActive()> getMaxActive() - 3
  • getNumIdle() < 2

數據源似乎允許比指定的最大活動連接數多3個活動連接。