У нас есть API, который использует спящий режим в качестве инструмента ORM, и мы используем c3p0 в качестве обработчика пула соединений. У нас нет проблем, когда мы находимся под нагрузкой. Однако мы сталкиваемся с исключениями «невозможно получить соединение», когда API неактивен в течение дня или около того. Таким образом, если никто не использует API в выходные, мы получим ошибки подключения в понедельник утром.
Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
Мы используем mysql в качестве базы данных. В своем исследовании я узнал, что mySQL делает соединения устаревшими через 8 часов или около того. Возможно, пул соединений выдает устаревшее соединение с клиентом и, следовательно, исключения времени ожидания соединения для клиента.
В настоящее время у нас нет настроенного тестирования соединения в C3Po. Скажем, если я использую IdleTestPeriod для проверки соединения до того, как они будут переданы клиенту пулом. Что произойдет, если все мои соединения в какой-то момент не пройдут тест? Будут ли эти неудачные подключения удалены из пула, а новые активные подключения будут созданы снова?
В настоящее время это настройки c3p0, которые мы используем. Возможны ли другие причины этой проблемы?
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${----}"/>
<property name="jdbcUrl" value="${----}"/>
<property name="user" value="${----}"/>
<property name="password" value="${------}"/>
<property name="minPoolSize" value="5"/>
<property name="acquireIncrement" value="5" />
<property name="maxPoolSize" value="125" />
<property name="maxStatements" value="10" />
<property name="maxIdleTime" value="180" />
<property name="maxIdleTimeExcessConnections" value="30" />
<property name="checkoutTimeout" value="3000" />
<property name="preferredTestQuery" value="SELECT 1" />
</bean>