我有一个使用sqlalchemy与MySQL数据库交互的守护进程。由于交互很少,因此连接很容易超时。我试图通过在创建数据库引擎时设置各种标志来解决问题,例如, pool_recycle=3600
,但似乎没有任何帮助。
为了帮助我调试问题,我将本地mysql服务器的超时设置为10秒,并尝试了以下程序。
import time
import sqlalchemy
engine = sqlalchemy.engine.create_engine("mysql://localhost")
while True:
connection = engine.connect()
result = connection.execute("SELECT 1")
print result.fetchone()
connection.close()
time.sleep(15)
令人惊讶的是,我继续得到如下例外:
sqlalchemy.exc.OperationalError: (OperationalError) (2006, 'MySQL server has gone away')
但是,如果我删除对connection.close()
的调用,问题就会消失。这里发生了什么?为什么sqlalchemy每次拨打connect()
时都不会尝试建立新连接?
我正在使用带有sqlalchemy 0.9.8和MySQL 5.5.40的Python 2.7.3。
答案 0 :(得分:4)
MySQL具有自动连接关闭行为,
对于闲置8小时或更长时间的连接。 要避免出现此问题,请使用pool_recycle选项 它控制任何连接的最大年龄:
engine = create_engine(' mysql + mysqldb://...',pool_recycle = 3600)
你可以把" pool_recycle"调用create_engine时的参数。
答案 1 :(得分:2)
我不是100%确定这是否能解决您的问题,但在处理mysql时我遇到了类似的问题。只有当我使用pymysql连接数据库时才能修复它。
您可以像这样安装:
pip install pymysql
哪个适用于linux和windows(如果安装了它)
然后给出你的连接字符串:
import time
import sqlalchemy
engine = sqlalchemy.engine.create_engine("mysql+pymysql://localhost")
while True:
connection = engine.connect()
result = connection.execute("SELECT 1")
print result.fetchone()
connection.close()
time.sleep(15)
运行时我得到以下输出:
(1,)
(1,)
(1,)
(1,)
另一方面,我发现某些查询与SQLAlchemy 0.9.8打破。我不得不安装0.9.3版本,以便我的应用程序不再破坏。