首页 > 解决方案 > Psycopg2 connect_timeout 在 WSGI 应用程序中不起作用

问题描述

我使用在 apache2 服务器上运行的 spyne 库创建的 WSGI 应用程序(简单 HTTP RPC API)。它使用 psycopg2 库来处理数据库连接。

一切正常,但是当与数据库服务器的连接断开或无法通过网络访问服务器时,就会出现问题。发送请求时,它会挂起 120 秒(默认情况下似乎是 Unix 套接字超时),然后引发 psycopg2 OperationalError异常。

带有 connect_timeout 的 DB Connect 部分:

        try:
            connection_string = 'dbname=%s user=%s host=%s password=%s connect_timeout=5' % (db_name, db_user, server_ip, '')
            cx = psycopg2.connect(connection_string)
        except psycopg2.OperationalError as e:
            log.error('Unable to connect to the database at %s, %s' % (server_ip, e))

我尝试在其他脚本中使用这部分代码,它按预期工作,5 秒后引发OperationalError异常,但是当我在 apache2 上的 WSGI 应用程序中运行相同的代码时,这不起作用。

我试图为WSGIDaemonProcess设置'socket-timeout=5',之后它只挂起 5 秒,但它返回 HTTP 代码 504 给客户端而不是 psycopg2 异常。我不知道为什么它会忽略 WSGI 应用程序中的 psycop2.connect 超时。

有谁知道,请问有什么问题吗?

谢谢 !

标签: pythonapache2mod-wsgipsycopg2wsgi

解决方案


我当然不是 Python 专家,但我很确定如果你使用的psycopg2.extensions.set_wait_callbacklibpq的 PQConnectPolling 机制,它会忽略connect_timeout参数。

不确定是否有更好的方法,但您可以使用作为模板实现自己的回调并将超时传递给select.select方法


推荐阅读