sqlalchemy + MySQL连接超时

时间:2014-12-15 22:30:36

标签: python mysql sqlalchemy

我有一个使用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。

2 个答案:

答案 0 :(得分:4)

the document mention:

  

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版本,以便我的应用程序不再破坏。