网络中断后c3p0重新连接

时间:2016-07-11 10:33:21

标签: java spring tomcat c3p0

应用程序连接到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分钟才能恢复数据库连接。

请问您有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

loginTimeout=60;socketTimeout=60

也许只有一个就够了,但我可以用这两个来做。 这个链接有很多帮助http://jtds.sourceforge.net/faq.html