我们有一个使用 hibernate 作为 ORM 工具的 api,我们使用 c3p0 作为连接池处理程序。当我们处于负载状态时,我们没有问题。但是,当 api 一天左右处于非活动状态时,我们将遇到“无法获得连接”异常。因此,如果周末没有人使用该 API,我们会在周一早上收到连接错误。
原因:java.sql.SQLException:客户端检出连接的尝试已超时。
我们使用mysql作为数据库。在我的研究中,我了解到 mySQL 会在 8 小时左右后使连接失效。连接池可能会向客户端发出过时的连接,因此客户端的连接超时异常。
目前,我们没有在 C3Po 中配置任何连接测试。可以说,如果我在池将连接提供给客户端之前使用 IdleTestPeriod 测试连接。那么如果我的所有连接在某个时间点都未能通过测试会发生什么?是否会从池中删除那些失败的连接并再次生成新的活动连接?
目前,这是我们正在使用的 c3p0 设置。这个问题还有其他可能的原因吗?
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${----}"/>
<property name="jdbcUrl" value="${----}"/>
<property name="user" value="${----}"/>
<property name="password" value="${------}"/>
<property name="minPoolSize" value="5"/>
<property name="acquireIncrement" value="5" />
<property name="maxPoolSize" value="125" />
<property name="maxStatements" value="10" />
<property name="maxIdleTime" value="180" />
<property name="maxIdleTimeExcessConnections" value="30" />
<property name="checkoutTimeout" value="3000" />
<property name="preferredTestQuery" value="SELECT 1" />
</bean>