Należy naprawdę pójść na C3P0 zestawianiem połączeń: http://www.mchange.com/projects/c3p0/index.html#hibernate-specific
istnieje punkt w dokumentacji C3P0 na ten temat: http://www.mchange.com/projects/c3p0/index.html#configuring_recovery
Najpierw trzeba prawidłowo skonfigurować C3P0, co w przypadku użycia musi hibernacji zdarzyć w pliku c3p0.properties.
W swoim c3p0.properties umieścić te właściwości, aby ponownie połączyć się ponownie w nieskończoność co 3 sekundy, gdy baza danych jest w dół:
c3p0.acquireRetryAttempts = 0
c3p0.acquireRetryDelay = 3000
c3p0.breakAfterAcquireFailure = false
Ponadto, aby uniknąć zerwanych połączeń leżące w basenie nieskończoność używać połączenia zarządzania wiekiem:
c3p0.maxConnectionAge = 6000
c3p0.maxIdleTime = 6000
c3p0.maxIdleTimeExcessConnections = 1800
c3p0.idleConnectionTestPeriod = 3600
te mogą być dość drogie, ale przydatne, jeśli powyżej nie wystarcza:
c3p0.testConnectionOnCheckout = true
c3p0.preferredTestQuery = SELECT 1;
Można też sprawdzić szczelność połączeń, które uniemożliwiają odzyskanie:
c3p0.debugUnreturnedConnectionStackTraces = true
I wreszcie, upewnij się, że jest uzależniony C3P0 z hibernacji poprawnie, włącz rejestrowanie debugowania dla pakietu „com.mchange” i sprawdzić, czy C3P0 mówi cokolwiek o sobie. Powinien on określać właściwości konfiguracji, które są ładowane, więc sprawdź, czy wszystko tam jest.
Mam nadzieję, że to pomoże.
Tak, to był mój pierwszy krok. Ale to nie zadziałało. Zrobiłem wszystko, o czym mówisz, ale bez rezultatu. Tester puli połączeń C3p0 nie jest wywoływany, jeśli DB jest wyłączony. Jeśli DB działa i uruchomiłem aplikację, gdy tester działa również i widzę, że jest w stanie sprawdzić stan połączenia. Ale chcę wiedzieć, co zrobić, gdy DB jest wyłączony. Chodzi mi o to, że aplikacja próbowała utworzyć pulę połączeń, ale bez powodzenia, po pewnym czasie spróbuje to zrobić jeszcze raz. – Andrey
Jeśli DB jest wyłączony, będzie ponawiał próby aż do przejęciaRetryAttempts razy, z opóźnieniem przejęciaRetryDelay pomiędzy każdą próbą i po tym prawdopodobnie spowoduje wyjątek. –
Tak, to jest to, co widzę. Hibernate spróbuje ponownie połączyć metodę acquireRetryAttempts z opóźnieniem metody loseRetryDelay, ale po wystąpieniu wyjątku. I nie rozumiem, jak rozumieć, czy hibernacja jest połączona z DB. – Andrey