2011-01-18 15 views
6

Czy ktoś zna sposób ponownego przywrócenia/ponowienia połączenia hibernacji. Mam na myśli na przykład: zdalny DB jest wyłączony i zaczynam swoją aplikację. Hibernacja nie może nawiązać połączenia. to nie wyszło. Ale aplikacja nie jest zamknięta. Czy istnieje sposób na powiedzenie hibernacji, aby spróbować jeszcze raz nawiązać połączenie?Odzyskaj połączenie hibernacji

góry dzięki

Odpowiedz

1

C3P0 jest wewnętrzna realizacja połączenia basen dla hibernacji.

Dodaj "hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider" w pliku właściwości hibernacji. Utwórz plik c3p0.properties ustawiając odpowiednio parametry. Ten plik & c3p0-x.jar musi znajdować się w ścieżce klas.

c3p0.properties

  • c3p0.idleConnectionTestPeriod: Jeśli jest to liczba większa niż 0, C3P0 przetestuje wszystkie bezczynny, połączono ale niezaznaczone-out połączenia, każdy to liczba sekund.

  • c3p0.testConnectionOnCheckout: Używaj tylko w razie potrzeby. Kosztowny. Jeśli ma wartość true, operacja zostanie wykonana przy każdym sprawdzeniu połączenia, aby sprawdzić, czy połączenie jest prawidłowe. Lepszy wybór: okresowo sprawdzaj połączenia, używając idleConnectionTestPeriod.

Istnieje kilka innych właściwości, które mogą być skonfigurowane w hibernate.properties & c3p0.properties.

+0

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

+0

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. –

+0

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

18

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.

0

mogą być próby wywołania metody .getCurrentSession() zamiast .openSession()?

Jeśli połączenie nie działa, musisz ustanowić nowe.

Mam nadzieję, że to pomoże.