2015-11-15 15 views
6

Proszę wszystkich o odpowiedź, której nie mogłem znaleźć w dokumencie HikariCP. Biorąc ustawić następujące parametry basenu:W jaki sposób Hikari przetwarza połączenia?

minimumIdle 1 
idleTimeout 10 minutes 
maxLifeTime 20 minutes 

Kiedy moja aplikacja pozostaje bezczynne (z nikim podejmowania wniosków) w nocy, spodziewam Hikari aby zamknąć każde połączenie po 10 minutach od ostatniego żądania połączenia użytkownika, po ostatnie połączenie jest zamknij utwórz nowy (i przytrzymaj go w puli), a następnie zamknij i ponownie utwórz to bezczynne połączenie co 20 minut. Czy dobrze zrozumiałem?

Faktem jest, że po okresie bezczynności w mojej aplikacji, widzę (uppon następnego życzenie) następujący wyjątek:

WARN c.z.hikari.proxy.ConnectionProxy - Connection [email protected] <POOL_NAME> marked as broken because of SQLSTATE(08003), ErrorCode(17008). 
java.sql.SQLRecoverableException: Closed Connection 

Połączenie prawdopodobnie został zamknięty przez Oracle i nie może być używany. Spróbuję tego uniknąć, korzystając z powyższej konfiguracji. Inną kwestią jest to, że nie rozumiem, dlaczego otrzymuję zamknięte połączenie z puli. To nie powinno się zdarzyć, ponieważ Hikari testuje stan połączenia przed jego zwrotem ...

Uwaga: Nie jestem właścicielem bazy danych, nie mogę jej skonfigurować ani pozwolić na jej rekonfigurację w celu dostosowania do moich potrzeb. Nie mam również dostępu do jego konfiguracji.

Nasz set-up jest Wiosna 4.1.6, 4.3.7 z Hibernate JPA 2.1 API, Hikari 2.1.0

Odpowiedz

2

Zrozumienie parametrów basen jest prawidłowe. Możliwe, że wystąpienie Oracle ma krótszy czas bezczynności niż 10 minut. Jedna rzecz, którą możesz zrobić, to włączyć rejestrowanie poziomu DEBUG dla pakietu com.zaxxer.hikari. Dostaniesz dużo więcej informacji o tym, co dzieje się wewnątrz HikariCP, bez bycia zbyt hałaśliwym.

Możesz opublikować dziennik jako issue on Github, a przyjrzymy się temu.

+0

Ok, zobaczę, czy mogę uzyskać przydatne logi. Jaka jest Twoja opinia na temat hikari, która zwraca mi zamknięte połączenie? Ponieważ korzystam z Oracle 11g przy użyciu najnowszego sterownika JDBC, funkcja isValid() powinna działać. Widzę ten wielki piękny wyjątek SQLException, gdy Hibernate próbuje wykonać zapytanie w zamkniętym połączeniu. Tak więc definitywnie otrzymuję zamknięte połączenie z puli. –

+0

Byłem całkiem pewny, że sterownik Oracle poprawnie zaimplementował interfejs API isAlive() JDBC4, ale możesz spróbować zamiast tego skonfigurować parametr connectionTestQuery. HikariCP użyje tego zamiast tego, jeśli jest skonfigurowany. Uwaga: Upewnij się również, że Spring i/lub Hibernate nie buforuje połączeń w sesji (w jakiś sposób) - być może ustawienie. – brettw

+0

Mam więcej informacji. Wygląda na to, że podczas uruchamiania aplikacji mamy wyciek połączenia. Jeszcze przed pierwszym żądaniem wynikającym z interakcji użytkownika. Musimy to zbadać. Poinformuję cię dalej, gdy będę miał więcej informacji. Dzięki hikari rejestrowanie statystyk źródeł danych. :-) –

Powiązane problemy