2011-01-18 4 views
6

Кто-нибудь знает, как восстановить/снова включить спящий режим. Я имею в виду, например: удаленная БД отключена, и я запускаю свое приложение. Hibernate не может установить соединение. он не работает. Но приложение не закрыто. Есть ли способ сказать, что спящий режим пытается еще раз установить соединение?Восстановить спящий режим

Заранее спасибо

ответ

1

C3P0 является внутренней реализацией подключения бассейна для спящего режима.

Добавить "hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider" в файл свойств спящего режима. Создайте файл c3p0.properties, задав параметры соответствующим образом. Этот файл & c3p0-x.jar должен быть в classpath.

c3p0.properties

  • c3p0.idleConnectionTestPeriod: Если это число больше 0, c3p0 будет тестировать все неработающие, но объединяли непроверенные-аут соединения, каждое это число секунд.

  • c3p0.testConnectionOnCheckout: Используйте только при необходимости. Дорогая. Если значение true, операция выполняется при каждой проверке соединения, чтобы убедиться, что соединение действительно. Лучший выбор: периодически проверять соединения с помощью idleConnectionTestPeriod.

Есть несколько других свойств, которые могут быть сконфигурированы в hibernate.properties & c3p0.properties.

+0

Да, это был мой первый шаг. Но это не сработало. Я сделал все, о чем вы говорите, но безрезультатно. Тестер пула соединений C3p0 не вызывается, если DB не работает. Если DB работает, и я начал приложение, когда тестер работает, а я вижу, что он может проверить состояние соединения. Но я хочу знать, что делать, если DB не работает. Я имел в виду, что приложение пыталось создать пул соединений, но без succes, после некоторого времени он попытается сделать это еще раз. – Andrey

+0

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

+0

Да, это то, что я вижу. Hibernate пытается повторно подключить getRetryAttempts с задержкой полученияRetryDelay, но после того, как нет исключения. И я не понимаю, как понять, спящий подключен или нет к БД. – Andrey

18

Вы действительно должны пойти на 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 говорит вы ничего о себе. Он должен содержать свойства конфигурации, которые загружаются, поэтому посмотрите, все ли это.

Надеюсь, это поможет.

0

Может быть, вы пытаетесь вызвать метод .getCurrentSession() вместо .openSession()?

Если соединение падает, вы должны установить новый.

Надеюсь, это поможет.