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

标签 python mysql flask mysql-python 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 数据库的持续打开连接。或者,也许我完全在错误的树上吠叫,如果是的话,希望有人知道。

最佳答案

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

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_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)
并获得连接:mysql.get_db().cursor()所有其他语法都是相同的,从那以后我没有遇到任何问题。已经使用这个解决方案很长时间了。

关于大约一天后,Python 失去了与 MySQL 数据库的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60286623/

相关文章:

python - 高效存储和读取大数据文件

python - 如何在 FastAPI 中将字典列表作为 Body 参数发送?

python - 我的用户应该如何为 Mac 安装 Python 命令行应用程序?

mysql 查询对于一列值返回 NULL

mysql - 如何从 BEFORE UPDATE 触发器内的同一个表中检索计数

python - 带有 Flask 'mongoengine.errors.NotRegistered' 问题的 mongoengine

python - 将 HTML 下拉列表中的值发送到 Flask app.route

python - 确定类属性是否为只读数据描述符

php - MySQL:将postid从一个表复制到同一数据库中的另一个表

python - 禁用模板缓存 Jinja2