我有一个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分钟后加载页面。
有人有使用SQLAzure和SQLAlchemy的经验吗?
我找到了解决此问题的方法。请注意,这绝对不是一个修复,因为该网站以前运行得非常好。我们无法确定实际问题是什么,因为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,并将Pooling设置为No
。仅仅在应用程序级别(在SQL Alchemy中)关闭池是不起作用的,只有在驱动程序级别设置了池之后,事情才开始顺利进行。
在改变设置后,我现在已经4天没有问题了。