应用程序连接到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分钟才能恢复数据库连接。
请问您有什么建议吗?
答案 0 :(得分:2)
该问题与c3p0和HikariCP无关。我不得不修改jdbc url并添加这些属性:
loginTimeout=60;socketTimeout=60
也许只有一个就够了,但我可以用这两个来做。 这个链接有很多帮助http://jtds.sourceforge.net/faq.html