Délais d'expiration de la connexion à une base de données Postgres sur Amazon RDS à partir d'Azur
j'obtiens l'exception suivante dans mon application après avoir laissé une connexion de base de données inutilisée pendant un certain temps:
... An I/O error occured while sending to the backend.; nested exception is org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.] with root cause
java.net.SocketException: Operation timed out
at java.net.SocketInputStream.socketRead0(Native Method)
le même problème se produit dans psql et je n'ai pas de problèmes de connexion à une base de données locale, donc je suis presque sûr que le problème est sur RDS.
psql=> select 'ok';
SSL SYSCALL error: Operation timed out
psql=> select 'ok';
SSL SYSCALL error: EOF detected
The connection to the server was lost. Attempting reset: Succeeded.
j'ai trouvé ce autre question ce qui suggère un contournement qui a amélioré la situation (les temps morts prennent maintenant beaucoup plus de temps) mais ne l'a pas corrigé.
J'utilise le ressort Démarrer avec JDBC (tomcat connection pooling) et JDBCTemplate.
Est-il de contourner ou un correctif? Peut-être forcer le pool de connexion à tester et se reconnecter? Comment puis-je faire cela dans cet environnement?
modifier: C'est ma chaîne de connexion
jdbc:postgresql://myhost.c2estvxozjm3.eu-west-1.rds.amazonaws.com/dashboard?tcpKeepAlive=true
SOLUTION:
modifié les paramètres TCP_KeepAlive côté serveur RDS comme suggéré dans la réponse sélectionnée. Les paramètres que j'utilise sont:
tcp_keepalives_count 5
tcp_keepalives_idle 200
tcp_keepalives_interval 200
3 réponses
on dirait que quelque chose - peut-être un routeur NAT de votre côté, peut-être quelque chose de L'extrémité D'AWS-est le traçage de connexion, et oublie les connexions au bout d'un moment.
je suggère activer TCP keepalives. Vous pourriez être en mesure de les activer côté serveur dans la configuration AWS RDS; si ce n'est pas le cas, vous pouvez les Demander côté client dans le pilote JDBC.
TCP keepalive sont beaucoup mieux que de la validation/test de la requête, parce qu'ils sont beaucoup plus bas frais généraux, et de ils n'entraînent pas de spam inutile dans les journaux de requêtes du serveur.
Peut-être essayer
spring.datasource.validation-query=SELECT 1
spring.datasource.test-on-borrow=true
(Voir AbstractDataSourceConfiguration
pour les autres options.)
dans votre chaîne de connexion, incluez-vous aussi le port ou juste le point final? Essayez d'utiliser le paramètre entier dans votre chaîne de connexion. Vérifiez également que le groupe de sécurité assigné à l'instance RDS a les ports appropriés et le CIDR entrant défini.