2016-07-11 3 views
0

Приложение подключается к серверу MS SQL. Он использует c3p0 ComboPooledDataSource в среде Tomcat и Spring.c3p0 повторно подключается после отключения сети

Когда приложение теряет соединение с базой данных и получает его несколько секунд спустя, приложение восстанавливает соединение и может продолжить запрос к db быстро (как только сеть вернется). Но это сетевое обесточение длиннее, приложению требуется более 10 минут, чтобы восстановить соединение 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:

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

Я попробовал другие конфигурации, с не -zero checkoutTimeout, testConnectionOnCheckout = false и testConnectionOnCheckin = true, восстановление все еще очень велико.

Что случилось с моей конфигурацией? Я хотел бы восстановить соединение db, как только будут устранены сетевые проблемы.

Большого спасибо вам помочь

EDIT с конфигурацией Хакарей как это было предложено М. Deinum

Привет,

Я попытался с этой конфигурацией Хакарей:

<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

Для начала я использовал бы другой пул соединений, например, [HikariCP] (https://github.com/brettwooldridge/HikariCP) вместо C3P0. Рядом с этим я бы предложил использовать драйверы JDBC от Microsoft, поскольку они более свежие и имеют поддержку 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. Я должен был изменить URL JDBC и добавьте следующие свойства:

loginTimeout=60;socketTimeout=60 

Может быть только один достаточно, но я мог бы сделать работу с обоими из них. Эта ссылка помогает много http://jtds.sourceforge.net/faq.html

Смежные вопросы