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&useEncoding=true&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 № 1DBCP 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.