c3p0 网络中断后重新连接

c3p0 reconnect after network outage

应用程序连接到 MS SQL 服务器。它在 Tomcat 和 Spring 环境中使用 c3p0 ComboPooledDataSource。

当应用程序失去数据库连接并在几秒钟后恢复连接时,应用程序会恢复连接并可以继续快速查询数据库(一旦网络恢复)。 但如果网络中断时间更长,应用程序需要超过 10 分钟才能在网络恢复后恢复数据库连接。

当数据库连接在 10 分钟后恢复时,我看到了这些日志:

[WARNING] Exception on close of inner statement.java.sql.SQLException: Invalid state, the Connection object is closed.
at net.sourceforge.jtds.jdbc.TdsCore.checkOpen(TdsCore.java:481)     
[WARNING] [c3p0] A PooledConnection that has already signalled a Connection error is still in use! 
[WARNING] [c3p0] Another error has occurred [ java.sql.SQLException: Invalid state, the Connection object is closed. ] which will not be reported to listeners!java.sql.SQLException: Invalid state, the Connection object is closed.

这里是spring-config.xml配置:

<bean id="CommonDataSource" abstract="true" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="net.sourceforge.jtds.jdbc.Driver" />
    <property name="minPoolSize" value="${db.minPoolSize}" />
    <property name="maxPoolSize" value="${db.maxPoolSize}" />
    <property name="acquireRetryAttempts" value="0" />
    <property name="checkoutTimeout" value="0" />
    <property name="testConnectionOnCheckout" value="true" />
    <property name="testConnectionOnCheckin" value="false" />
    <property name="idleConnectionTestPeriod" value="10" />
    <property name="preferredTestQuery" value="select 1" />
</bean>

我试过其他配置,checkoutTimeout 非零,testConnectionOnCheckout=false 和 testConnectionOnCheckin=true,恢复时间仍然很长。

我的配置有什么问题?我想在网络问题修复后立即恢复数据库连接。

非常感谢你的帮助

根据 M. Deinum

使用 Hakari 配置进行编辑

嗨,

我试过这个 Hakari 配置:

<bean id="CommonDataSource" abstract="true" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <property name="maximumPoolSize" value="${db.maxPoolSize}" />
    <property name="connectionTestQuery" value="select 1"/>
    <property name="allowPoolSuspension" value="true"/>
</bean>

但行为是相似的:我必须等待 10-15 分钟才能恢复数据库连接。

请问您有什么建议吗?

该问题与 c3p0 和 HikariCP 无关。我不得不修改 jdbc url 并添加这些属性:

loginTimeout=60;socketTimeout=60

也许只有一个就足够了,但我可以用这两个来完成这项工作。 这个link很有帮助http://jtds.sourceforge.net/faq.html