Python sqlalchemy+;MySQL连接超时
我有一个使用sqlalchemy与MySQL数据库交互的守护进程。由于交互很少,连接很容易超时。我试图通过在创建数据库引擎时设置各种标志来解决这个问题,例如,Python sqlalchemy+;MySQL连接超时,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我有一个使用sqlalchemy与MySQL数据库交互的守护进程。由于交互很少,连接很容易超时。我试图通过在创建数据库引擎时设置各种标志来解决这个问题,例如,pool\u recycle=3600,但似乎没有任何帮助 为了帮助我调试这个问题,我将本地mysql服务器的超时设置为10秒,并尝试了以下程序 import time import sqlalchemy engine = sqlalchemy.engine.create_engine("mysql://localhost") whil
pool\u 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()
的调用,问题就会消失。这是怎么回事?为什么每次我调用connect()
,sqlalchemy都不尝试建立新的连接
我正在将Python 2.7.3与sqlalchemy 0.9.8和MySQL 5.5.40一起使用。我不能100%确定这是否能解决您的问题,但我在处理MySQL时遇到了类似的问题。只有当我使用pymysql连接到数据库时,它才被修复 您可以这样安装:
pip install pymysql
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)
这将适用于linux和windows(如果已安装)
然后按如下方式给出连接字符串:
pip install pymysql
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,以使我的应用程序不再中断
MySQL具有自动关闭连接的行为,对于已空闲八小时或更长时间的连接。 要避免出现此问题,请使用pool\u recycle选项 它控制任何连接的最大使用期限: 引擎=创建引擎('mysql+mysqldb://...,池_回收=3600)
在调用create_引擎时,您可以只放置“pool_recycle”参数 谢谢你的信息-我会试试看!对于那些感兴趣的人来说,一个更新:到目前为止,唯一有效的方法就是用Ubuntu的Upstart监控脚本。当守护进程由于超时而崩溃时,Upstart将重新启动它。这不是最优雅的解决方案,但无论如何我都需要流程监控,所以就是这样。