Вы действительно должны пойти на C3P0 пулы соединений: http://www.mchange.com/projects/c3p0/index.html#hibernate-specific
Существует раздел в C3P0 документации по этому вопросу: http://www.mchange.com/projects/c3p0/index.html#configuring_recovery
Сначала вы должны правильно настроить C3P0, что в случае использования спящего режима должно произойти в файле c3p0.properties.
В вашем c3p0.properties поместить эти свойства, чтобы повторить попытку восстановить на неопределенное время каждую 3 секунды, когда база данных вниз:
c3p0.acquireRetryAttempts = 0
c3p0.acquireRetryDelay = 3000
c3p0.breakAfterAcquireFailure = false
Кроме того, чтобы избежать сломанных соединений, лежащими в бассейне на неопределенное время, используйте управление подключениями возраста:
c3p0.maxConnectionAge = 6000
c3p0.maxIdleTime = 6000
c3p0.maxIdleTimeExcessConnections = 1800
c3p0.idleConnectionTestPeriod = 3600
это может быть довольно дорогим, но полезно, если выше, не достаточно:
c3p0.testConnectionOnCheckout = true
c3p0.preferredTestQuery = SELECT 1;
Вы также можете проверить на наличие утечек соединения, которые предотвращают восстановление:
c3p0.debugUnreturnedConnectionStackTraces = true
И, наконец, убедитесь, что C3P0 зацеплен с Hibernate правильно, включить ведение журнала отладки для пакета «com.mchange» и посмотреть, если C3P0 говорит вы ничего о себе. Он должен содержать свойства конфигурации, которые загружаются, поэтому посмотрите, все ли это.
Надеюсь, это поможет.
Да, это был мой первый шаг. Но это не сработало. Я сделал все, о чем вы говорите, но безрезультатно. Тестер пула соединений C3p0 не вызывается, если DB не работает. Если DB работает, и я начал приложение, когда тестер работает, а я вижу, что он может проверить состояние соединения. Но я хочу знать, что делать, если DB не работает. Я имел в виду, что приложение пыталось создать пул соединений, но без succes, после некоторого времени он попытается сделать это еще раз. – Andrey
Если вы находитесь в нижней части базы данных, она будет пытаться восстановить времяRetryAttempts с задержкой полученияRetryDelay между каждой попыткой и после этого, вероятно, приведет к исключению. –
Да, это то, что я вижу. Hibernate пытается повторно подключить getRetryAttempts с задержкой полученияRetryDelay, но после того, как нет исключения. И я не понимаю, как понять, спящий подключен или нет к БД. – Andrey