/ / Java + Tomcat, Umierające połączenie z bazą danych? - java, mysql, baza danych, tomcat

Java + Tomcat, Dying połączenie z bazą danych? - java, mysql, baza danych, tomcat

Mam konfigurację instancji tomcat, ale połączenie z bazą danych, które skonfigurowałem w pliku context.xml, umiera po okresach bezczynności.

Podczas sprawdzania dzienników pojawia się następujący błąd:

com.mysql.jdbc.exceptions.jdbc4.Wyjątek komunikacyjny: Ostatni pakiet pomyślnie odebrany z serwera wynosił 68051 sekund temu. Ostatni pakiet wysłany pomyślnie na serwer wynosił 68051 sekund temu, która jest dłuższa niż wartość skonfigurowana przez serwer „wait_timeout”. Należy rozważyć wygaśnięcie i / lub testowanie ważność połączenia przed użyciem w aplikacji, zwiększając wartości skonfigurowane przez serwer dla limitów czasu klienta lub przy użyciu oprogramowania sprzęgającego / J właściwość połączenia „autoReconnect = true”, aby uniknąć tego problemu.

Oto konfiguracja w pliku context.xml:

<Resource name="dataSourceName"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="username"
password="********"
removeAbandoned = "true"
logAbandoned = "true"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=utf-8"  />

Korzystam z autoReconnect = ture, tak jak mówi błąd, ale połączenie wciąż umiera. Nigdy wcześniej tego nie widziałem.

Sprawdziłem również, czy wszystkie połączenia z bazą danych są poprawnie zamykane.

Odpowiedzi:

8 dla odpowiedzi № 1

Dokumentacja Tomcat

DBCP korzysta z puli połączeń z bazą danych Jakarta-Commons. Opiera się na liczbie komponentów Jakarta-Commons:

* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool

Ten atrybut może ci pomóc.

removeAbandonedTimeout="60"

Korzystam z tej samej puli połączeń i ustawiam te właściwości, aby zapobiec temu, czego nie skonfigurowano za pośrednictwem tomcat. Ale jeśli pierwsza rzecz nie działa, wypróbuj je.

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

5 dla odpowiedzi nr 2

Aby wyjaśnić, co tak naprawdę powoduje. MySQL domyślnie przerywa otwarte połączenia po 8 godzinach bezczynności. Jednak pula połączeń z bazą danych zachowa połączenia dłużej.

Tak więc, ustawiając timeBetweenEvictionRunsMillis = 300000, instruujesz pulę połączeń, aby uruchamiała połączenia i eksmitowała i zamykała bezczynne co 5 minut.


1 dla odpowiedzi nr 3

Opcja removeAbandoned jest przestarzała od DBCP 1.2 (chociaż nadal obecny w oddziale 1.3). Tutajto nieoficjalne wyjaśnienie.


0 dla odpowiedzi nr 4

Nie wiem, czy powyższa odpowiedź brzmiw zasadzie to samo, ale niektóre z naszych systemów używają połączenia DB mniej więcej raz w tygodniu i widziałem, że zapewniamy mysql flagę -Otimeout lub coś takiego w celu ustawienia limitu czasu połączenia.