We właściwościach konfiguracyjnych użyłeś właściwości c3p0 maxIdleTime, ale właściwości c3p0 są konfigurowane za pomocą c3p0.
prefiks lub hibernate.c3p0.
. Zwróć uwagę, że włączenie dowolnego z c3p0
Właściwości automatycznie włącza odpowiedniego dostawcę połączenia za pomocą heurystyki hibernacji. W logu nie widać, że używasz c3p0. Jeśli nie masz skonfigurowanych źródeł danych, Hibernate użyje hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
. Ten dostawca połączeń ma wbudowaną podstawową pulę połączeń, dla której można ustawić hibernate.connection.pool_size
, ale jest używany tylko do celów programistycznych. Nigdy nie używaj go w środowisku produkcyjnym.
Możesz mieć niekończącą się dyskusję na temat Jak naprawić java.net.SocketException:uszkodzony potok . Po pewnym czasie zdasz sobie sprawę, że pozostałeś otwarty połączenia w basenie, które nagle zamykają się po drugiej stronie z następujących powodów:
- Zapory ogniowe lub routery mogą blokować nieaktywne połączenia (protokół MySQL klient/serwer nie działa).
- Serwer MySQL może zamykać bezczynne połączenia, które przekraczają
wait_timeout
lubinteractive_timeout
próg.
Aby pomóc w rozwiązaniu tych problemów, można skorzystać z następujących wskazówek:
- Używana jest najnowsza (5.1.13+) wersja sterownika JDBC.
- Upewnij się, że
wait_timeout
iinteractive_timeout
są ustawione wystarczająco wysoko. Sprawdź, czyinteractiveClient
jest używany. - Upewnij się, że
tcpKeepalive
jest włączony. - Upewnij się, że wszelkie konfigurowalne ustawienia zapory sieciowej lub limitu czasu routera pozwalają na maksymalny oczekiwany czas bezczynności połączenia.
- Upewnij się, że połączenia są prawidłowe, gdy są używane z puli połączeń. Użyj zapytania, które zaczyna się od
/* ping */
wykonać lekkie polecenie ping zamiast pełnego zapytania. Zwróć uwagę, że składnia polecenia ping musi być dokładnie taka, jak określono tutaj. - Wyraźnie zweryfikuj połączenie przed jego użyciem, jeśli połączenie było bezczynne przez dłuższy czas.
- Zminimalizuj czas, przez jaki obiekt połączenia pozostaje bezczynny, podczas gdy wykonywana jest inna logika aplikacji.
Aby zachować zgodność z niektórymi z tych opcji, lepiej użyj puli połączeń, z której możesz korzystać z Hibernate. Hibernate obsługuje commons-dbcp, c3p0 i proxool. Możesz także skonfigurować źródło danych JNDI na serwerze WWW do używania z hibernacją, ma pulę połączeń. Zobacz Rozdział 7 Pula połączeń ze złączem/J .
Jeśli chcesz skonfigurować Hibernate z c3p0, powinieneś przeczytać ten Jak skonfigurować pulę połączeń C3P0 . Przykładową konfigurację dbcp znajdziesz w tym poście Wyjątek MySQL, Hibernate i Broken Pipe . Niezależnie od tego, jaki zestaw połączeń użyjesz, zależy od Ciebie.