【问题标题】:Python loses connection to MySQL database after about a dayPython 在大约一天后失去与 MySQL 数据库的连接
【发布时间】:2020-06-02 19:29:45
【问题描述】:

我正在使用 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 数据库的持续打开连接。或者我可能完全是在叫错树,如果有人知道的话。

【问题讨论】:

  • 发布后我发现了池连接。我知道它适用于多线程应用程序,而我的不是,但它很容易实现,我希望它有所帮助。当然,要等到明天我才能知道它是否确实如此,而且我仍然愿意接受更好的解决方案。

标签: python mysql flask mysql-python mysql-connector-python


【解决方案1】:

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

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连接,几乎是一个drop-in的替代品。

来自 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()

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

【讨论】:

  • 想知道在连接池的情况下您遇到了什么样的问题?谈到 Flask-MySQL,您是只创建一次连接还是在每次查询时创建连接?
  • 我只获得了一次连接,以为我每次查询都会获得光标。已经很久了,我忘记了连接池的问题。我认为它经常随机抛出 500 个错误,但我不记得更多了。
  • 我已经读到连接不是线程安全的......所以很困惑是否重用相同的连接是一种强大的方法
  • 这很可能就是我偶尔遇到连接池问题的原因。那肯定是有道理的。 Flask-MySql 库在后台管理连接,这可以解释为什么它工作得更好。
猜你喜欢
  • 1970-01-01
  • 2021-02-22
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
相关资源
最近更新 更多