【问题标题】:SQLAlchemy hangs while connecting to SQL Azure, but not alwaysSQLAlchemy 在连接到 SQL Azure 时挂起,但并非总是如此
【发布时间】:2014-03-20 10:28:53
【问题描述】:

我有一个 django 应用程序,它使用 SQLAlchemy 连接到 Windows Azure 上的 SQL Server 实例。该应用程序在本地 SQL Server 实例上运行了 3 个月,在 Azure 实例上运行了一个多月。在一周没有任何代码更改之后,这个问题出现在这个星期一。

网站使用:

  • Python 2.7
  • Django 1.6
  • Apache/Nginx
  • SQLAlchemy 0.9.3
  • pyODBC 3.0.7
  • 免费TDS

从池中拉出连接后,应用程序似乎立即锁定(我在工作流程的每个点都设置了详细日志记录)。我认为这与连接过时有关。所以我们尝试让 pool_recycle 非常短(5 秒),一直到一个小时。那没有帮助。

我们还尝试使用 NullPool 在每个页面视图上强制建立新连接。然而,这也无济于事。大约 15 分钟后,该站点将再次完全锁定(意味着无法查看使用数据库的页面)。

奇怪的是,一半遇到“挂起”的计算机,最终会在大约 15 分钟后加载页面。

有人使用过 SQL Azure 和 SQLAlchemy 吗?

【问题讨论】:

    标签: python django sqlalchemy azure-sql-database pyodbc


    【解决方案1】:

    我找到了解决此问题的方法。请注意,这绝对不是一个修复程序,因为该站点之前运行得非常好。我们无法确定实际问题是什么,因为 SQL Azure 没有错误日志(我建议永远不要在真实数据库服务器上考虑 SQL Azure 的 100 个原因之一)。

    我通过在应用程序级别和驱动程序级别关闭所有连接池解决了这个问题。

    在使我的/etc/odbcinst.ini 看起来像这样之后,事情开始持续运行:

    [FreeTDS]
    Description = TDS driver (Sybase/MS SQL)
    # Some installations may differ in the paths
    Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
    Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
    CPReuse =
    CPTimeout = 0
    FileUsage = 1
    Pooling = No
    

    关键是将CPTimeout(连接池超时)设置为0,将池设置为No。只是在应用程序级别(在 SQL Alchemy 中)关闭池是行不通的,只有在驱动程序级别设置它之后,事情才开始顺利运行。

    更改该设置后,我现在 4 天没有问题。

    【讨论】:

      猜你喜欢
      • 2011-03-07
      • 1970-01-01
      • 2020-04-12
      • 2019-12-07
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      相关资源
      最近更新 更多