SQLAlchemy在连接到SQL Azure时挂起,但并非总是如此

时间:2014-02-19 20:20:53

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

我有一个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
  • freetds的

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

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

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

有没有人有过使用SQL Azure和SQLAlchemy的经验?

1 个答案:

答案 0 :(得分:3)

我找到了解决此问题的方法。请注意,这绝对不是一个修复,因为该网站之前工作得非常好。我们无法确定实际问题是什么,因为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天没有问题。