tomcat, postgres 12 i idle_connection_timeout problem

0

Witam,
mam problem z aplikacją która jest w chmurze.
Aplikacja jest zbudowana w oparciu o spring-security, hibernate , tomcat9 z c3p0.
Problem pojawia się w gdy userzy nie logują się do aplikacji przez więcej niż 1dzień np. weekend.
Wiem, że wystarczy przestawić w konf postgresa paramert idle_in_transaction_session_timeout na 0 ale niestety dostawca nie rekomenduje takiego rozwiązania.
Skutkiem "wycięcia sesji" aplikacji przez bazę danych jest to że pojawia się tylko strona logowania i dalej aplikacja się wysypuje. Restart tomcat pomaga ale nie jest to docelowe rozwiązanie.
Czy jest jakaś opcja , konfiguracja itp. która będzie trzymać to połączenie niezależnie od konfigu postgresql ?

0

Jeszcze raz, jaki jest problem? Chcesz mieć sesję trwającą 3 dni?

2

Tak jakbyś miał reconnecta zwalonego w tej swojej aplikacji.

0

@Pinek: Niekoniecznie - problemem jest to że po 1 dniu bezczynności aplikacja nie może dobić się do bazy danych.
Może źle patrzę na problem - sesja powinna się (tak mi się wydaje) tworzyć w momencie zalogowania user'a i kończyć wraz z jego wylogowaniem ? Dobrze kombinuję ?

3

Połączenie może być ubijane na warstwie sieciowej, jeśli nie ma na nim aktywności. Doczytaj o ustawieniach c3p0. Możesz tak skonfigurować, żeby mieć funkcjonalność "keep aliave".
Keywords: testConnectionOnCheckout / testConnectionOnCheckin / ...

0

Rzeczywiście problem był z połączeniem które jest egzekwowane przez hibernate i plik hibernate.properties.

hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider
hibernate.c3p0.min_size=1
hibernate.c3p0.max_size=5
hibernate.c3p0.timeout=300
hibernate.c3p0.max_statements=50
hibernate.c3p0.idle_test_period=300
hibernate.testOnBorrow=true
hibernate.c3p0.testConnectionInCheckout=true
hibernate.c3p0.testConnectionOnCheckout=true
hibernate.c3p0.preferredTestQuery=SELECT 1

Teraz parametr preferredTestQuery pomaga wstać połączeniu do bazy danych.
Ale jest jeszcze 1 problem , w applicationContext-security.xml aplikacja odwołuje się do filtra z parametrem custom-filter
before="FORM_LOGIN_FILTER" . W nim korzystam ze zwykłych query (tak jest zbudowana aplikacja) gdzie wyciągam ważne do dalszego
logowania dane z bazy. Do podłączenia do bazy używam osobnego pliku hibernate.cfg.xml gdzie mam powtórzone parametry do bazy.
Jeśli wykomentuję ten filtr wszystko działa jak trzeba ale jeśli go używam (jest konieczny) to tylko select 1 jest podtrzymany
w DB. Sesja dla zwykłego selecta z filtra nie potrafi się podnieść. Kombinowałem z ustawieniem podobnego parametru c3p0 select 2 w pliku
hibernate.cfg.xml ale nie przyniósł efektu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1