Как получить Spring Boot для автоматического переподключения к PostgreSQL?
Я использую Spring Boot для подключения к базе данных PostgreSQL. Я проверил, что данные записываются в базу данных, если Spring Boot запускается после базы данных.
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
Когда в разработке происходят изменения в базе данных, я сталкиваюсь с исключениями: PreparedStatementCallback; SQL []; This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.
Обратите внимание, что база данных снова доступна, когда возникают исключения; Я думаю, что проблема в том, что соединение устарело, потому что конечная точка базы данных, к которой он изначально подключен, больше не доступна из-за перезапуска. Перезапуск Spring Boot решает проблему.
Как настроить Spring Boot для повторного подключения к PostgreSQL, чтобы мне не нужно было его перезапускать?
Я пытался следить за ответами в Spring Boot JPA - настройка автоматического переподключения и Как переподключить базу данных, если соединение закрыто в Spring jpa?, Я не уверен, отличается ли поведение PostgreSQL от MySQL. Мое чтение документации Spring Boot не помогло; Я не знаю компонентов, описанных достаточно хорошо, чтобы понять, на какую документацию мне следует обратить внимание.
1 ответ
Spring boot должен быть настроен на автоматическое переподключение, проблема в том, что он не знает о разрыве соединения.
Поскольку вы уже используете тест на заимствование и запрос проверки, просто попробуйте уменьшить интервал проверки, чтобы он выполнялся каждый раз.
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=0
Пул соединений Tomcat JDBC включен testOnBorrow
:
(булево) Указывает, будут ли объекты проверяться перед заимствованием из пула. Если объект не может быть проверен, он будет удален из пула, и мы попытаемся заимствовать другой. ПРИМЕЧАНИЕ. - Чтобы действительное значение имело какой-либо эффект, для параметра validationQuery или validatorClassName должно быть задано ненулевое значение. Для более эффективной проверки см. ValidationInterval. Значением по умолчанию является false
Но будьте в курсе validationInterval
:
(долго), избегайте лишней проверки, только запускайте проверку не более на этой частоте - время в миллисекундах. Если соединение требуется для проверки, но было проверено ранее в течение этого интервала, оно не будет подтверждено снова. Значение по умолчанию - 30000 (30 секунд).