Я получаю следующее исключение в своем приложении после оставления соединения с базой данных в течение некоторого времени:
... 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)
То же самое происходит в psql И у меня нет проблем с подключением к локальной базе данных, поэтому я уверен, что проблема связана с 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.
Я нашел этот другой вопрос, который предлагает работу, которая улучшила ситуацию (таймауты теперь занимают намного больше времени), но не исправили ее.
Я использую Spring Boot с JDBC (пул соединений tomcat) и JDBCTemplate.
Есть ли работа или исправление? Возможно, заставляя пул соединений тестировать и повторно подключаться? Как это сделать в этой среде?
EDIT: Это моя строка соединения
jdbc:postgresql://myhost.c2estvxozjm3.eu-west-1.rds.amazonaws.com/dashboard?tcpKeepAlive=true
РЕШЕНИЕ:
Отредактированы параметры TCP_KeepAlive на стороне сервера RDS, как указано в выбранном ответе. Параметры, которые я использую:
tcp_keepalives_count 5
tcp_keepalives_idle 200
tcp_keepalives_interval 200