c3p0 非活动连接在最长等待时间后未从连接池中剔除

c3p0 inactive connection not being culled from connection pool after max wait time

我现有的应用程序使用 Spring 3.0.3、Hibernate 3.6.0 和 Oracle 数据库。

我已经设置好了 运行 c3p0,但我发现了一些我无法真正弄清楚的奇怪现象。

这是我的Spring设置

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${xxgglom.driver}" />
<property name="jdbcUrl" value="${url}" />
<property name="user" value="${username}" />
<property name="password" value="${password}" />
<property name="minPoolSize" value='5' />
<property name="maxPoolSize" value="40" />
<property name="maxIdleTime" value="240" />
<property name="maxIdleTimeExcessConnections" value="180" />
<property name="maxStatements" value="50" />
<property name="testConnectionOnCheckin" value="true" />
<property name="testConnectionOnCheckout" value="false" />
<property name="idleConnectionTestPeriod" value="300" />     

我检查了数据库 v$session,发现它在池中创建了 5 个连接。我将开始使用该应用程序,它会在需要时增加池大小。所以我可以通过检查日志告诉 C3P0 正在工作。我遇到的一个问题是。有这些不活动的连接,它们超过了 maxIdleTime。

我查看了他们的存活时间,他们已经超过了 240 秒。我再次检查数据库,它们都显示不活动,但是当我查看日志时告诉我这个。

trace com.mchange.v2.resourcepool.BasicResourcePool@282fafdd [managed: 5, unused: 4, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f9f7637)

我不确定到底发生了什么,但过了一会儿,这些空闲连接开始堆积起来,而且它们似乎并没有从连接池中被剔除。有什么建议吗?

maxIdleTime 不保证在任何特定时间都会剔除连接。只要在您的配置下每个连接至少每 4 分钟使用一次,它们就不会被剔除。如果你想无条件地限制 Connections 的实时时间(我不知道你为什么会这样做),你可以使用 maxConnectionAge.