psycopg2.DatabaseError:SSL SYSCALL错误:连接超时

Kah*_*nne 5 python postgresql ssl sqlalchemy tornado

我们正在开发一个需要访问数据库的网站。访问这样的页面可以正常工作;连续访问多个也可以。但是,如果您等待较长时间(似乎15分钟就足够了),则访问另一个页面将挂起很长时间(观察到10至20分钟)。之后,将打印此错误

以下是相关代码:

if __name__ == "__main__":
conf = load_conf(sys.argv[1])

engine = create_engine('postgresql://%s:%s@%s:%s/%s' %
                       (conf['db']['user'], conf['db']['pw'], conf['db']['address'],
                        conf['db']['port'], conf['db']['database']), echo=False)

Session = sessionmaker(bind=engine)
session = Session()

app = make_app(session, conf)
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Run Code Online (Sandbox Code Playgroud)

该数据库位于其他服务器上。我的个人计算机在荷兰,而数据库在德国的服务器中。我伴侣的个人计算机在意大利。

最值得注意的是,此问题在运行Arch Linux的计算机上存在。我们已经在另外两台运行Windows和其他Linux的计算机上对此进行了测试(我假设Ubuntu,可以检查是否需要)。在这一点上,我们不知道如何继续调试。

当然,我会应要求提供任何其他需要的信息。

Ben*_*ell 9

目前还不清楚这 15 分钟的超时来自哪里,尽管正如其他评论者所指出的那样,它可能来自您的计算机和服务器之间的网络中的某些东西。然而,无论它来自哪里,在 SQLAlchemy 中有几个选项可以解决它。

  • pool_pre_ping=True选项将在任何尝试重用连接之前发出一个简单的测试查询,允许它检测此问题并透明地重新连接(以很小的性能成本)
  • pool_recycle=600选项告诉 sqlalchemy 不要重用空闲时间超过 10 分钟的连接。这是对该问题的更有效解决方案,因为它不添加任何新查询,但它要求您计算出要使用的最佳回收超时。