python - 我如何在 psycopg2 线程连接类中重新连接到 postgreSQL? SSL SYSCALL 错误 : EOF detected in Azure? 导致的失败

标签 python python-3.x postgresql psycopg2

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

1)SSL SYSCALL 错误的原因是什么。我搜索了所有线程,排除了常见的嫌疑人。 2) 我如何在线程连接池类中失败时重新连接 --> 这正在 flask 应用程序中使用

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

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]

最佳答案

有很多方法可以处理这个问题。

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

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

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

关于python - 我如何在 psycopg2 线程连接类中重新连接到 postgreSQL? SSL SYSCALL 错误 : EOF detected in Azure? 导致的失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69503662/

相关文章:

Python请求,如何将内容类型添加到多部分/表单数据请求

python - 将以字符串形式给出的数组范围转换为数字

postgresql - 带参数的列 postgres 函数的默认值

sql - 运行封装查询的最有效方式

python - 如何将 z3py 表达式转换为 smtlib 2 格式

python - 在使用 readlines() 创建的字符串中使用 for 循环插入多行

python - 将多个列表写入 CSV 中单个单元格中的不同列

python - 如何在主窗口中更改 PyQt5 目录 View 的大小?

postgresql - 创建 pgAdmin 4 主键时出现语法错误

python - JSONSchema 暗示其架构的资源