【问题标题】:How do i reconnect to postgreSQL in psycopg2 threaded connection class? Failure caused by SSL SYSCALL error: EOF detected in Azure?如何在 psycopg2 线程连接类中重新连接到 postgreSQL? SSL SYSCALL 错误导致的失败:在 Azure 中检测到 EOF?
【发布时间】:2021-11-28 20:58:04
【问题描述】:

在我们移植到 Azure 中的 PostgreSQL 微软数据库之前,我们的应用程序运行良好。然后周期性地,我们的应用程序无缘无故地失败,并且我们到处都有 SSL SYSCALL 错误 - 在 DELETE 上等等。我们已经尝试了互联网使用保活参数、RAM、内存和其他所有内容中描述的所有内容。我们想尝试自动重新建立连接。但是我们有一个线程连接池。看过这个帖子Psycopg2 auto reconnect inside a class 但是我们读取数据库的函数在另一个类中。所以我们有两个问题:

1) SSL SYSCALL 错误的原因是什么。我已经搜索了所有线程,并排除了通常的嫌疑人。 2)我如何在线程连接池类中发生故障时重新连接->这正在烧瓶应用程序中使用

这是我们的应用程序的结构

class DBClass(object):
    _instance = None
    conn= None
    def __new__(cls):
        if cls._instance is None:
            cls._instance = object.__new__(cls)
            try:
                max_conn = 12
                keepalive_args = { "keepalives": 1, "keepalives_idle": 25, "keepalives_interval": 4,"keepalives_count": 9,
                }
               
                db._instance.pool = psycopg2.pool.ThreadedConnectionPool(3, max_conn, db=,
                                                                               host=, user=,
                                                                               password=,
                                                                               port=, **keepalive_args)

            except Exception as ex:
                db._instance = None
                raise ex

        return cls._instance

    def __enter__(self):
        self.conn= self._instance.pool.getconn()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self._instance.pool.putconn(self.connection)

    def __del__(self):
        self._instance.pool.closeall()

#another python 模块有一个名为 clsEmployee 的类。我们有几十个使用上述数据库类的函数。像这样。

    with DBClass() as db:
        pg_conn = db.connection
        cur = pg_conn.cursor()
        cur.execute("SELECT * from emp")
        row = cur.fetchone()[0]

【问题讨论】:

    标签: python python-3.x postgresql psycopg2


    【解决方案1】:

    有很多方法可以解决这个问题。

    Psycopg2 auto reconnect inside a class 提出的解决方案如果您对执行 db 工作的调用在 DBClass 之外仍然有效。您只需要调用数据库的函数,然后用装饰器包装它们。装饰器所做的只是添加一个循环以允许多次调用该函数,将实际函数包装在 try/except 中并在 except 上重新连接。这实际上是处理此类问题的一种非常标准的方法,因为它适用于 DB、API 或任何可能失败的东西。您可能想要做的一件事是为您的重试添加指数退避(睡眠呼叫在哪里)。

    您拥有的另一个选项是创建您自己的游标子类,该子类在重写版本的执行中具有相同的重试逻辑。这将完成同样的事情,这只是您认为更容易使用的一个案例。

    由于这是在 Flask 应用程序中使用的,您可以修改第一种方法,而不是在模型代码级别进行重试,您可以在 Flask 路由级别进行重试。

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2017-12-29
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      相关资源
      最近更新 更多