J'exécute Spring Boot en me connectant à une base de données PostgreSQL. J'ai vérifié que les données sont écrites dans la base de données si Spring Boot est démarré après la base de données.
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
Lorsqu'il y a des changements dans la base de données en cours de développement, je rencontre des exceptions: PreparedStatementCallback; SQL []; This connection has been closed.; nested exception is org.postgresql.util.PSQLException: This connection has been closed.
Notez que la base de données est à nouveau accessible lorsque les exceptions se produisent; Je pense que le problème est que la connexion est périmée car le point de terminaison de la base de données auquel elle était connectée à l'origine n'est plus disponible en raison du redémarrage. Le redémarrage de Spring Boot résout le problème.
Comment configurer Spring Boot pour se reconnecter à PostgreSQL afin que je n'aie pas besoin de le redémarrer?
J'ai tenté de suivre les réponses dans Spring Boot JPA - configuration de la reconnexion automatique et Comment reconnecter la base de données si la connexion s'est fermée dans spring jpa? . Je ne sais pas si le comportement de PostgreSQL est différent de MySQL. Ma lecture de la documentation Spring Boot n'a pas aidé; Je ne connais pas suffisamment les composants décrits pour comprendre quelle documentation je dois consulter.
Le démarrage de printemps doit être configuré pour se reconnecter automatiquement, le problème est qu'il n'est pas au courant de la connexion rompue.
Puisque vous utilisez déjà le test lors de l'emprunt et de la requête de validation, essayez simplement de réduire l'intervalle de validation pour qu'il soit exécuté à chaque fois.
spring.datasource.Tomcat.test-on-borrow=true
spring.datasource.Tomcat.validation-query=SELECT 1
spring.datasource.Tomcat.validation-interval=0
pool de connexions Tomcat jdbc sur testOnBorrow
:
(booléen) Indique si les objets seront validés avant d'être empruntés au pool. Si l'objet ne parvient pas à valider, il sera supprimé du pool et nous tenterons d'en emprunter un autre. REMARQUE - pour qu'une valeur vraie ait un effet, le paramètre validationQuery ou validatorClassName doit être défini sur une chaîne non nulle. Afin d'avoir une validation plus efficace, voir validationInterval . La valeur par défaut est false
Mais soyez conscient de validationInterval
:
(long) évitez une validation excessive, exécutez la validation au maximum à cette fréquence - temps en millisecondes. Si une connexion doit être validée, mais a été validée précédemment dans cet intervalle, elle ne sera pas validée à nouveau. La valeur par défaut est 30000 (30 secondes ).