【问题标题】:libpq Postgres PQexecParams 2 hours timeoutlibpq Postgres PQexecParams 2 小时超时
【发布时间】:2018-04-12 16:09:29
【问题描述】:

我将 libpq v9.6.8 用于我的应用程序(24/7 运行),它将数据插入到 postgres 数据库中。我还运行PQexecParams 来获取表格列。但是随机(有时一周一次,但周末两次)这个阻塞的PQexecParams调用在大约2小时后以某种方式返回。在这两小时内,我的应用程序只是挂起......插入是通过 async PQsendQueryParams 完成的。

有没有办法为PQexecParams 配置超时(因为我在 lib 中可能在 postgres 服务器上找不到任何合适的超时设置)?有没有更好的方法来执行选择同步?

提前谢谢你

【问题讨论】:

    标签: postgresql timeout libpq


    【解决方案1】:

    这两个小时表明 TCP keepalive 启动并确定连接已损坏。

    您可以设置keepalives_idle 连接参数,以便提前发生超时,并且您不会停滞两个小时。

    但您可能还想知道是什么中止了网络连接。您首先应该查看 PostgreSQL 服务器日志;您应该会看到一条与客户端匹配的错误消息。可能是网络组件出了问题——特别是寻找防火墙。

    【讨论】:

    • 感谢 keepalives_idle 的提示,我将使用该选项运行测试。由于我无权访问 postgres 服务器配置,因此无法更改日志级别,并且使用当前级别我看不到任何错误..
    • 遗憾的是,我不得不指出我再次遇到了同样的错误,但这一次在 2 小时后什么也没发生,6 小时后呼叫仍然阻止了应用程序。我将 keepalives_idle 设置为 5...还有什么建议吗?
    • 可能不是网络问题,而是锁。您写的是并发插入:您的PQexecParams 是否只选择或修改数据?那么查看pg_locks 并设置log_lock_waits = on 可能是个好主意。无论如何,试着找出这个会话的后端进程正在运行。它还在吗?它是否消耗CPU?当您将strace 附加到它时,它是否显示活动?
    猜你喜欢
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2020-06-05
    • 2010-11-19
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多