我得到了我的應用程序以下異常離開一定的時間數據庫連接空閒後:超時連接到Postgres數據庫在Amazon RDS從Azure的
... 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.
我發現這個other question這表明周圍的工作,情況有所好轉(超時現在需要更長的時間),但沒有解決問題。
我正在使用Spring Boot with JDBC(tomcat連接池)和JDBCTemplate。
是否有解決方法或解決方法? 也許強制連接池測試並重新連接? 我該如何在這種環境下做到這一點?
編輯: 這是我的連接字符串
jdbc:postgresql://myhost.c2estvxozjm3.eu-west-1.rds.amazonaws.com/dashboard?tcpKeepAlive=true
SOLUTION:
編輯爲所選答案提出的RDS服務器端TCP_KEEPALIVE參數。我使用的參數是:
tcp_keepalives_count 5
tcp_keepalives_idle 200
tcp_keepalives_interval 200
這似乎解決了這個問題,因爲我在AWS postgres端添加了這些keepalive,我再也沒有超時了。我將刪除我嘗試過的其他東西(TCP內核中的keepalive,keepalive連接字符串和連接池上的連接驗證),並查看它是否自己保留。 –
這解決了這個問題,我在RDS上使用的參數在編輯的問題上。 –