我已经在网上搜索了一段时间,但我还没有解决这个问题:
我有以下数据源配置:
<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>
这会强制放弃的连接过程运行并清理旧连接。
我不应该干预这些参数,尤其是不要将它们设置得太低,以免出现性能问题。
我还尝试了此处显示的解决方案以达到相同的效果,直到我将timeBetweenEvictionRunsMillis
and更改minEvictableIdleTimeMillis
为较低的值。而且它仍然没有将连接限制为 2。