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

DMJ*_*DMJ 6 python mysql mysql-python flask mysql-connector-python

我正在使用 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 行,列数少于 30,Python 应用程序运行良好,直到它停顿了大约一天。

所以,这里希望有人有一个很好的解决方案来保持与 MySQL 数据库的持续打开连接。或者,也许我完全在错误的树上吠叫,如果是的话,希望有人知道。

DMJ*_*DMJ 5

我现在工作了。使用池连接似乎为我解决了这个问题。

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())
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

来自 bash: pip install Flask-MySQL

添加MYSQL_DATABASE_HOST, MYSQL_DATABASE_USER, MYSQL_DATABASE_PASSWORD,MYSQL_DATABASE_DB到您的 Flask 配置。然后在包含 Flask App 对象的主 Python 文件中:

from flaskext.mysql import MySQL
mysql = MySQL()
mysql.init_app(app)
Run Code Online (Sandbox Code Playgroud)

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

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