Psycopg2 connect_timeout在WSGI应用程序中不起作用

时间:2018-12-19 13:33:25

标签: python apache2 mod-wsgi psycopg2 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超时。

有人知道吗,可能是什么问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

我当然不是Python专家,但是我很确定您是否使用psycopg2.extensions.set_wait_callback,然后使用libpq的PQConnectPolling机制,该机制会忽略connect_timeout参数

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