2016-09-18 46 views
10

Używam Spring Boot łączącego się z bazą danych PostgreSQL. Sprawdziłem, czy dane są zapisywane w bazie danych, jeśli Spring Boot jest uruchamiany po bazie danych.Jak uzyskać Spring Boot, aby automatycznie ponownie połączyć się z PostgreSQL?

spring.datasource.url = jdbc:postgresql://localhost/dbname 
spring.datasource.username = user 
spring.datasource.password = secret 
spring.datasource.driver-class-name = org.postgresql.Driver 
spring.datasource.testOnBorrow=true 
spring.datasource.validationQuery=SELECT 1 

Kiedy występują zmiany w bazie danych w rozwoju, biegnę do wyjątków: PreparedStatementCallback; SQL []; This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.

Zauważ, że baza danych jest dostępna ponownie, gdy występują wyjątki; Myślę, że problem polega na tym, że połączenie jest nieaktualne, ponieważ punkt końcowy bazy danych, z którym był pierwotnie połączony, nie jest już dostępny z powodu ponownego uruchomienia. Ponowne uruchomienie Spring Boot rozwiązuje problem.

Jak skonfigurować Spring Boot, aby ponownie połączyć się z PostgreSQL, więc nie trzeba go restartować?

Podjęłam próbę podążania za odpowiedziami w Spring Boot JPA - configuring auto reconnect i How to reconnect database if the connection closed in spring jpa?. Nie jestem pewien, czy zachowanie PostgreSQL jest inne niż MySQL. Moje czytanie Spring Boot documentation nie pomogło; Nie znam elementów opisanych wystarczająco dobrze, aby zrozumieć, na jaką dokumentację powinienem patrzeć.

+1

Z jakiej puli połączeń korzystasz? Jeśli go nie używasz, możesz spróbować przełączyć się na Hikari. W przeszłości widziałem takie problemy z 'tomcat-jdbc', który jest domyślną pulą połączeń. –

+1

Masz test na pożyczkę, ale prawdopodobnie także chcesz ustawić kontrolę, gdy upłynie limit czasu bezczynności i bezczynności. W ten sposób połączenia są regularnie sprawdzane i usuwane z puli, jeśli są nieprawidłowe. –

+0

@AndyWilkinson Myślę, że używam tomcat-jdbc, ponieważ mój pom zawiera spring-boot-starter-jdbc. – mattm

Odpowiedz

6

Wiosenne uruchamianie powinno być skonfigurowane tak, aby ponownie się łączyło automatycznie, problem polega na tym, że nie jest świadomy zerwanego połączenia.

Ponieważ używasz już testu po zapytaniu o pożyczkę i sprawdzanie poprawności, po prostu spróbuj skracając przedział sprawdzania poprawności, aby był wykonywany za każdym razem.

spring.datasource.tomcat.test-on-borrow=true 
spring.datasource.tomcat.validation-query=SELECT 1 
spring.datasource.tomcat.validation-interval=0 

Tomcat jdbc connection pool na tekst na zaciągnięcie pożyczki:

(logiczna) Wskazanie, czy obiekty zostaną zatwierdzone przed zapożyczone z basenu. Jeśli obiekt nie zostanie zatwierdzony, zostanie usunięty z puli, a my spróbujemy pożyczyć inny. UWAGA - aby wartość prawdziwa miała jakikolwiek efekt, parametr validationQuery lub validatorClassName musi być ustawiony na niepustą wartość. Aby uzyskać bardziej wydajną weryfikację, zobacz validationInterval. Wartość domyślna to false

jednak zdawać sobie sprawę z przedziału (walidacji):

(długie) unikać nadmiaru walidacji, tylko uruchomić sprawdzanie co najwyżej na tej częstotliwości - czas w milisekundach. Jeśli połączenie wymaga sprawdzenia, ale zostało wcześniej zatwierdzone w tym przedziale, nie będzie ono ponownie sprawdzane. Domyślna wartość to 30000 (30 sekund).