Python psycopg2.DatabaseError:SSL系统调用错误:连接超时

Python psycopg2.DatabaseError:SSL系统调用错误:连接超时,python,postgresql,ssl,sqlalchemy,tornado,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

我们正在开发一个需要数据库访问的网站。访问这样的页面效果很好;访问一行中的多个也可以。但是,如果您等待很长时间(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()
数据库位于不同的服务器上。我的个人电脑在荷兰,而数据库在德国的服务器上。我搭档的个人电脑在意大利

最值得注意的是,这个问题只出现在我运行Arch Linux的机器上。我们已经在另外两台运行Windows和其他Linux的机器上进行了测试(我假设Ubuntu可以根据需要进行检查)。此时,我们还不知道如何继续调试


当然,我会根据请求提供任何额外的必要信息。

不清楚这15分钟的超时是从哪里来的,尽管其他评论指出,它可能来自您的计算机和服务器之间的网络。然而,无论它来自哪里,在SQLAlchemy中都有几个选项可以解决它

  • 该选项将在尝试重用连接之前发出一个简单的测试查询,允许它检测此问题并透明地重新连接(以较小的性能成本)
  • 该选项告诉sqlalchemy不要重用空闲时间超过10分钟的连接。这是一个更有效的问题解决方案,因为它不添加任何新查询,但它要求您计算出要使用的最佳循环超时
连接已超时。捕获异常并创建一个新会话,然后重试。我们可以这样做,但正如我所说,引发异常需要10-20分钟,因此它无法解决问题。似乎有什么东西在一段时间后中断了您的连接。检查防火墙!在我的个人电脑上不使用任何防火墙典型的原因是NAT。它不一定要在你的机器上——它可以在你和服务器之间的任何地方。VPN、网关或其他隧道技术通常使用NAT。近年来,由于IPv4 IP耗尽,ISP开始使用载波级NAT。检查您的internet连接——如果您没有到服务器的直接第2层路由连接,NAT可能有故障。