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_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、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_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()
所有其他语法都是一样的,从那以后我再也没有遇到过任何问题。已经使用这个解决方案很长时间了。