Настройте пул соединений GlassFish JDBC для обработки отработки отказа Amazon RDS Multi-AZ

У меня есть приложение Java EE, работающее в GlassFish на EC2, с базой данных MySQL на Amazon RDS. Я пытаюсь настроить пул соединений JDBC, чтобы минимизировать время простоя в случае сбоя базы данных.

Моя текущая конфигурация работает некорректно во время восстановления после отказа Multi-AZ, так как экземпляр резервной базы данных становится доступным через пару минут (в соответствии с консолью AWS), в то время как мой экземпляр GlassFish остается застрявшим в течение длительного времени (около 15 минут ) до возобновления работы.

Пул соединений настроен так:

asadmin create-jdbc-connection-pool --restype javax.sql.ConnectionPoolDataSource \
--datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource \
--isconnectvalidatereq=true --validateatmostonceperiod=60 --validationmethod=auto-commit \
--property user=$DBUSER:password=$DBPASS:databaseName=$DBNAME:serverName=$DBHOST:port=$DBPORT \
MyPool

Если я используюSingle-AZ db.m1.small экземпляр иперезагружать база данных из консоли GlassFish сделает недействительными прерванные соединения, сгенерирует некоторые исключения и затем снова подключится, как только база данных станет доступной. В этой настройке я получаю менее 1 минуты простоя.

Если я используюMulti-AZ db.m1.small экземпляр иперезагрузка с отказоустойчивостью с консоли AWS я не вижу исключений вообще. Сервер полностью останавливается, время ожидания всех входящих запросов истекает. Через 15 минут я наконец получаю это:

Communication failure detected when attempting to perform read query outside of a transaction. Attempting to retry query. Error was: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 940,715 milliseconds ago.  The last packet sent successfully to the server was 935,598 milliseconds ago.

Похоже, что каждый поток HTTP блокируется на недопустимом соединении без исключения, и поэтому нет возможности выполнить проверку соединения.

Время простоя в случае Multi-AZ всегда составляет от 15 до 16 минут, поэтому оно выглядит как какое-то время, но я не смог его изменить.

Вещи, которые я пытался без успеха:

тайм-аут / восстановление утечки соединениятайм-аут утечки заявлениявремя ожидания заявленияиспользуя другой метод проверкис помощьюMysqlDataSource вместоMysqlConnectionPoolDataSource

Как установить время ожидания для зависших запросов, чтобы соединения в пуле использовались повторно, проверялись и заменялись? Или как я могу позволить GlassFish обнаруживать сбой базы данных?

Ответы на вопрос(1)

Ваш ответ на вопрос