【问题标题】:Timeouts connecting to a Postgres database on Amazon RDS from Azure从 Azure 连接到 Amazon RDS 上的 Postgres 数据库超时
【发布时间】:2014-05-06 23:10:07
【问题描述】:

在让数据库连接闲置一段时间后,我的应用程序中出现以下异常:

... 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,它提出了一种解决方法,可以改善这种情况(超时现在需要更长的时间),但没有解决。

我正在使用带有 JDBC(tomcat 连接池)和 JDBCTemplate 的 Spring Boot。

有解决方法或修复方法吗? 也许强制连接池测试并重新连接? 在这种环境下我该怎么做?

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

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

【问题讨论】:

    标签: postgresql amazon-rds spring-jdbc spring-boot


    【解决方案1】:

    它看起来像是连接跟踪,可能是您端的 NAT 路由器,也可能是 AWS 端的一些东西 - 是连接跟踪,并且在一段时间后忘记了连接。

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

    TCP keepalive 比验证/测试查询好得多,因为它们的开销要低得多,而且不会在服务器查询日志中产生不必要的日志垃圾邮件。

    【讨论】:

    • 这似乎已经解决了这个问题,因为我在 AWS postgres 端添加了这些 keepalives,所以我再也没有超时了。我将删除我尝试过的其他内容(Linux 内核上的 TCP keepalives、连接字符串上的 keepalive 和连接池上的连接验证),看看它是否独立。
    • 这解决了问题,我在 RDS 上使用的参数在编辑的问题上。
    【解决方案2】:

    不妨试试

    spring.datasource.validation-query=SELECT 1
    spring.datasource.test-on-borrow=true
    

    (请参阅AbstractDataSourceConfiguration 了解其他选项。)

    【讨论】:

    • 这种“解决”问题,我的开发机器没有任何问题,但在我的服务器(托管在 Azure 上)上,当我离开连接时需要 15 分钟才能得到响应闲置的。随后的响应是立即的,直到我再次让连接空闲一段时间。除了规格之外,我的开发机器和服务器之间的区别在于我更改了操作系统的 TCP keepalive 设置,如this question 中所述。接下来将尝试在服务器上进行设置。
    • 运气不好,更改了Azure服务器上的TCPKeepAlive,但连接空闲后仍有15m延迟问题。
    • 验证查询也会导致大量日志垃圾邮件,通常不是理想的选择,尽管有时您没有太多选择。
    【解决方案3】:

    在您的连接字符串中,您还包括端口还是仅包括端点?尝试在连接字符串中使用整个端点。还要检查以确保分配给 RDS 实例的安全组定义了正确的端口和入站 CIDR。

    【讨论】:

    • 将我的连接字符串添加到问题中(更改了主机名)。我可以使用该字符串连接到数据库,只有在我让连接空闲一段时间后才会出现问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2019-11-08
    相关资源
    最近更新 更多