在我们移植到 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/