2013-02-13 116 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个活动连接。