Python 大约一天后失去与 MySQL 数据库的连接

Python loses connection to MySQL database after about a day

我正在使用 Python、Flask、MySQL 和 uWSGI 开发基于 Web 的应用程序。但是,我 而不是 使用 SQL Alchemy 或任何其他 ORM。我正在使用一个旧的 PHP 应用程序中的现有数据库,该应用程序无论如何都不能很好地与 ORM 一起使用,所以我只是使用 mysql-connector 并手动编写查询。

应用程序在我第一次启动时工作正常,但当我第二天早上回来时,我发现它已经坏了。我会收到类似 mysql.connector.errors.InterfaceError: 2013: Lost connection to MySQL server during query 或类似 mysql.connector.errors.OperationalError: 2055: Lost connection to MySQL server at '10.0.0.25:3306', system error: 32 Broken pipe.

的错误

我一直在研究它,我想我知道问题出在哪里。我只是没能找到一个好的解决方案。据我所知,问题是我保持对数据库连接的全局引用,并且由于 Flask 应用程序始终 运行 在服务器上,最终该连接过期并变得无效。

我认为只需为每个查询创建一个新连接就足够简单了,但这似乎远非理想的解决方案。我想我还可以构建某种连接缓存机制,在一个小时左右后关闭旧连接,然后重新打开它。这是我能想到的最好的选择,但我仍然觉得应该有更好的选择。

我环顾四周,大多数收到这些错误的人都有巨大或损坏的表,或者类似的东西。这里情况不同。旧的 PHP 应用程序仍然运行良好,所有表的行数和列数均少于 50,000 行,并且 Python 应用程序在运行大约一天之前运行良好。

因此,希望有人有一个好的解决方案来保持与 MySQL 数据库的持续打开连接。或者我完全找错了树,希望有人知道。

我现在可以使用了。使用池连接似乎解决了我的问题。

mysql.connector.connect(
    host='10.0.0.25',
    user='xxxxxxx', 
    passwd='xxxxxxx', 
    database='xxxxxxx',
    pool_name='batman',
    pool_size = 3
)

def connection():
    """Get a connection and a cursor from the pool"""
    db = mysql.connector.connect(pool_name = 'batman')
    return (db, db.cursor())

我在每个查询函数之前调用connection(),然后在返回前关闭游标和连接。似乎工作。尽管如此,仍然对更好的解决方案持开放态度。

编辑

后来我找到了更好的解决方案。 (我仍然偶尔 运行 遇到池连接问题)。 Flask 实际上有一个专门的库来处理 mysql 个连接,这几乎是一个替代品。

来自 bash:pip install Flask-MySQL

MYSQL_DATABASE_HOSTMYSQL_DATABASE_USERMYSQL_DATABASE_PASSWORDMYSQL_DATABASE_DB 添加到您的 Flask 配置中。然后在包含 Flask App 对象的 Python 主文件中:

from flaskext.mysql import MySQL
mysql = MySQL()
mysql.init_app(app)

并获得连接:mysql.get_db().cursor()

所有其他语法都是一样的,从那以后我再也没有遇到过任何问题。已经使用这个解决方案很长时间了。