Приложение подключается к серверу 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 за минуты до подключения к базе данных.
У вас есть предложения, пожалуйста?
Для начала я использовал бы другой пул соединений, например, [HikariCP] (https://github.com/brettwooldridge/HikariCP) вместо C3P0. Рядом с этим я бы предложил использовать драйверы JDBC от Microsoft, поскольку они более свежие и имеют поддержку JDBC 4.x. В то время как драйвер jtds не имеет такой поддержки (он застрял на JDBC 3.0). –
Дополнительно https://github.com/brettwooldridge/HikariCP/wiki/Bad-Behavior:-Handling-Database-Down - интересное чтение (в котором также упоминается проблема, которая у вас есть, по-видимому, c3p0 блокируется при возникновении сетевых проблем). –
@M. Deinum: Спасибо за ваш ответ. Как вы думаете, я не могу достичь цели с помощью c3p0? Является ли HikariCP безопасным для производства? – marcesso