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 连接超时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLAlchemy 中设置连接超时

如何使用 Python+SQLAlchemy 远程连接 MySQL 数据库?

python使用SQLAlchemy模块连接MySQL

SqlAlchemy 的 MySQL (mariaDB) 连接错误

Flask,SQLAlchemy和多线程:MySQL连接太多

sqlalchemy连接 MySQL(转)