【问题标题】:psycopg2.DatabaseError: SSL SYSCALL error: Connection timed outpsycopg2.DatabaseError:SSL SYSCALL 错误:连接超时
【发布时间】:2017-12-29 08:07:14
【问题描述】:

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

以下是相关代码:

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,如果需要可以检查)。此时,我们不知道如何继续调试。

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

【问题讨论】:

  • 连接超时。捕获异常并创建一个新会话,然后重试。
  • 我们可以这样做,但是正如我所说,甚至需要 10-20 分钟才能引发异常,所以它不会解决问题。
  • 一段时间后您的连接似乎中断了。检查防火墙!
  • 我的个人机器上没有使用任何防火墙
  • 经典原因是 NAT。它不必在你的机器上——它可以在你和服务器之间的任何地方。 VPN、网关或其他隧道技术通常使用 NAT。近年来,由于 IPv4 IP 耗尽,ISP 开始使用运营商级 NAT。检查您的互联网连接——如果您没有与服务器的直接第 2 层路由连接,则 NAT 可能有问题。

标签: python postgresql ssl sqlalchemy tornado


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2016-05-21
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多