2016-07-11 4 views
0

응용 프로그램이 MS SQL 서버에 연결됩니다. Tomcat 및 Spring 환경에서 c3p0 ComboPooledDataSource를 사용합니다.네트워크 중단 후 c3p0 다시 연결

응용 프로그램이 데이터베이스 연결을 잃고 몇 초 후에 다시 연결되면 응용 프로그램은 연결을 복구하고 네트워크를 다시 찾는 즉시 데이터베이스를 빠르게 쿼리 할 수 ​​있습니다. 그러나 네트워크 중단이 길어지면 네트워크가 다시 돌아와서 응용 프로그램이 db 연결을 복구하는 데 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. 

봄-config.xml의 구성입니다 : : DB를 연결 10 분 후 다시 때

나는 이러한 로그를 참조

<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> 

나는 비와 함께, 다른 구성을 시도 -0 checkoutTimeout, testConnectionOnCheckout = false 및 testConnectionOnCheckin = true이면 복구가 여전히 매우 길다.

구성에 어떤 문제가 있습니까? 네트워크 문제가 해결되면 바로 db 연결을 복구하고 싶습니다. 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

처음에는 C3P0 대신 [HikariCP] (https://github.com/brettwooldridge/HikariCP)와 같은 다른 연결 풀을 사용했습니다. 그 다음으로는 Microsoft의 JDBC 드라이버를 사용하는 것이 좋습니다. JDBC 드라이버는 최신 버전이며 JDBC 4.x 옵션을 지원합니다. jtds 드라이버는 JDBC 3.0에서 지원되지 않습니다. –

+0

또한 https://github.com/brettwooldridge/HikariCP/wiki/Bad-Behavior:-Handling-Database-Down은 흥미로운 읽기입니다 (네트워크 문제가 발생할 때 분명히 c3p0이 잠겨 있음). –

+0

@M. Deinum : 답장을 보내 주셔서 감사합니다. 내가 c3p0로 목표에 도달 할 수 없다고 생각합니까? HikariCP는 생산을 위해 안전한가요? – marcesso

답변

2

문제는 c3p0 또는 HikariCP와 관련이 없습니다. jdbc URL을 수정하고 다음 속성을 추가해야했습니다.

loginTimeout=60;socketTimeout=60 

어쩌면 하나만 있으면 충분할 수도 있지만 둘 다로 작업 할 수 있습니다. 이 링크는 많은 도움이됩니다 http://jtds.sourceforge.net/faq.html

관련 문제