sqlalchemy + MySQL 连接超时
Posted
技术标签:
【中文标题】sqlalchemy + MySQL 连接超时【英文标题】:sqlalchemy + MySQL connection timeouts 【发布时间】:2014-12-15 22:30:36 【问题描述】:我有一个使用 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()
的调用,问题就会消失。这里发生了什么?为什么每次我调用 connect()
时 sqlalchemy 都不尝试建立新连接?
我使用 Python 2.7.3 和 sqlalchemy 0.9.8 和 MySQL 5.5.40。
【问题讨论】:
对那些感兴趣的人的更新:到目前为止唯一有效的是使用 Ubuntu 的 Upstart 监视脚本。当守护程序由于超时而崩溃时,Upstart 会重新启动它。这不是最优雅的解决方案,但无论如何我都需要流程监控,所以就是这样。 【参考方案1】:the document mention:
MySQL 具有自动连接关闭行为, 对于已空闲 8 小时或更长时间的连接。 要避免出现此问题,请使用 pool_recycle 选项 控制任何连接的最大年龄:
engine = create_engine('mysql+mysqldb://...', pool_recycle=3600)
您可以在调用 create_engine 时输入“pool_recycle”参数。
【讨论】:
【参考方案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 版才能让我的应用程序不再中断。
【讨论】:
感谢您的信息 - 我会试一试!以上是关于sqlalchemy + MySQL 连接超时的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python+SQLAlchemy 远程连接 MySQL 数据库?
SqlAlchemy 的 MySQL (mariaDB) 连接错误