微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 从Azure上连接到Amazon RDS上的Postgres数据库的超时

数据库连接空闲一段时间后,我的应用程序中会收到以下异常:
... 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引导与JDBC(tomcat连接池)和JDBCTemplate.

有没有工作或修复?
也许强制连接池测试和重新连接?
在这个环境下我该如何做?

编辑:
这是我的连接字符串

jdbc:postgresql://myhost.c2estvxozjm3.eu-west-1.rds.amazonaws.com/dashboard?tcpKeepAlive=true

解:

根据所选答案中的建议,编辑RDS服务器端TCP_KeepAlive参数.我使用的参数有:

tcp_keepalives_count      5
tcp_keepalives_idle     200
tcp_keepalives_interval 200
它看起来像是一些东西 – 也许你的终端上的NAT路由器,也许是在AWS的一端 – 连接跟踪,并在一段时间后忘记连接.

我建议enabling TCP keepalives.您可能可以在AWS RDS配置中启用它们的服务器端;如果没有,您可以在JDBC驱动程序中向客户端请求它们.

TCP keepalives比验证/测试查询好多了,因为它们的开销要低得多,并且不会在服务器查询日志中导致不必要的日志垃圾邮件.

原文地址:https://www.jb51.cc/postgresql/191736.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐