Délais de connexion à une base de données Postgres sur Amazon RDS à partir d'Azure
- Je obtenir de l'exception suivante dans mon application après avoir quitté une base de données de la connexion inactive pendant un certain laps de 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 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 qui suggère un travail autour de l'amélioration de la situation (délais d'attente maintenant prendre beaucoup plus de temps), mais n'ont pas le fixer.
Je suis en utilisant le Printemps de Démarrage avec JDBC (tomcat regroupement de connexion) et JDBCTemplate.
Est-il de contourner ou un correctif?
Peut-être forcer le pool de connexion pour le tester et de le reconnecter?
Comment dois-je faire dans ce contexte?
EDIT:
C'est ma chaîne de connexion
jdbc:postgresql://myhost.c2estvxozjm3.eu-west-1.rds.amazonaws.com/dashboard?tcpKeepAlive=true
SOLUTION:
Édité le serveur RDS côté TCP_KeepAlive paramètres comme suggéré dans la réponse choisie. Les paramètres que j'utilise sont:
tcp_keepalives_count 5
tcp_keepalives_idle 200
tcp_keepalives_interval 200
source d'informationauteur Cleber Goncalves
Vous devez vous connecter pour publier un commentaire.
Il ressemble à quelque chose - peut-être un routeur NAT sur votre fin, peut-être quelque chose sur AWS fin est suivi de connexion, et d'oublier les connexions après un certain temps.
Je suggère activation de TCP keepalive. Vous pourriez être en mesure afin de leur permettre de côté de serveur dans AWS configuration de RDS; si pas, vous pouvez demander leur 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 ils n'ont pas inutilement journal de spam sur le serveur journaux de requêtes.
Peut-être essayer
(Voir
AbstractDataSourceConfiguration
pour d'autres options.)Dans votre chaîne de connexion vous aussi, y compris le port ou tout simplement le point de terminaison? Essayez d'utiliser l'ensemble de point de terminaison dans votre chaîne de connexion. Aussi assurez-vous que le groupe de sécurité affecté à la RDS exemple les ports Entrants et CIDR défini.