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

Python在大约一天后失去与MySQL数据库的连接,python,mysql,flask,mysql-python,mysql-connector-python,Python,Mysql,Flask,Mysql Python,Mysql Connector Python,我正在使用Python、Flask、MySQL和uWSGI开发一个基于web的应用程序。然而,我并没有使用SQL炼金术或任何其他ORM。我使用的是一个旧PHP应用程序中预先存在的数据库,它无论如何都不能很好地与ORM配合使用,所以我只是使用mysql connector手工编写查询 当我第一次启动应用程序时,它工作正常,但当我第二天早上回来时,我发现它已经坏了。我将得到类似于mysql.connector.errors.InterfaceError:2013:在查询过程中与mysql服务器断开连

我正在使用Python、Flask、MySQL和uWSGI开发一个基于web的应用程序。然而,我并没有使用SQL炼金术或任何其他ORM。我使用的是一个旧PHP应用程序中预先存在的数据库,它无论如何都不能很好地与ORM配合使用,所以我只是使用
mysql connector
手工编写查询

当我第一次启动应用程序时,它工作正常,但当我第二天早上回来时,我发现它已经坏了。我将得到类似于
mysql.connector.errors.InterfaceError:2013:在查询过程中与mysql服务器断开连接
或类似的
mysql.connector.errors.OperationalError:2055:在'10.0.0.25:3306'时与mysql服务器断开连接,系统错误:32断开管道

我一直在研究它,我想我知道问题是什么。我只是没能找到一个好的解决办法。尽我所能,问题在于我保留了对数据库连接的全局引用,并且由于Flask应用程序始终在服务器上运行,最终该连接将过期并失效

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

我环顾四周,大多数收到这些错误的人都有巨大的或损坏的表,或者类似的东西。这里的情况并非如此。旧的PHP应用程序仍然运行良好,表的行数都少于50000行,列数也少于30列,Python应用程序运行良好,直到它运行了大约一天


因此,希望有人能找到一个好的解决方案来保持与MySQL数据库的持续开放连接。或者,如果希望有人知道的话,我可能完全找错了方向。

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

mysql.connector.connect(
host='10.0.0.25',
用户='xxxxxxx',
passwd='xxxxxxx',
数据库='xxxxxxx',
池名为“蝙蝠侠”,
池大小=3
)
def连接():
“”“从池中获取连接和游标”“”
db=mysql.connector.connect(池名称='batman')
返回(db,db.cursor())
我在每个查询函数之前调用
connection()
,然后在返回之前关闭光标和连接。似乎有效。但仍然有更好的解决方案

编辑 我找到了更好的解决办法。(我仍然偶尔遇到共用连接的问题)。实际上,Flask有一个专用的库来处理mysql连接,这几乎是一个替代品

来自bash:
pip安装Flask-MySQL

MYSQL\u数据库\u主机
MYSQL\u数据库\u用户
MYSQL\u数据库\u密码
MYSQL\u数据库\u数据库
添加到烧瓶配置中。然后在包含Flask App对象的主Python文件中:

从flaskext.mysql导入mysql
mysql=mysql()
mysql.init_应用程序(应用程序)
要获得连接:
mysql.get_db().cursor()


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

发布此内容后,我发现了池连接。我知道它是针对多线程应用程序的,而我的不是,但它很容易实现,我希望它能有所帮助。当然,明天我才知道是否有,我仍然愿意接受更好的解决方案。想知道在连接池的情况下,您遇到了什么样的问题?说到Flask MySQL,您是只创建了一次连接还是每次查询都创建了连接?我只获得了一次连接,虽然每次查询都会得到游标。已经很长时间了,我忘记了连接池的问题所在。我认为它每隔一段时间就会随机抛出500个错误,但我想不出更多的了。我读到连接不是线程安全的……我很困惑重用同一个连接是否是一种健壮的方法,这很可能就是我偶尔遇到连接池问题的原因。这当然是有道理的。Flask MySql库在后台管理连接,这就解释了为什么它工作得更好。