Python Flask、SQLAlchemy和多线程:MySQL连接太多

Python Flask、SQLAlchemy和多线程:MySQL连接太多,python,mysql,multithreading,flask,sqlalchemy,Python,Mysql,Multithreading,Flask,Sqlalchemy,我正在使用Flask+sqlalchemy+MySQL编写多线程应用程序 SQL炼金术设置: SQLALCHEMY_TRACK_MODIFICATIONS = True SQLALCHEMY_POOL_SIZE = 200 SQLALCHEMY_MAX_OVERFLOW = 50 SQLALCHEMY_POOL_RECYCLE = 5 我的应用程序最多可以同时运行300个线程。在每个线程中都有一些DB用法,如: # task == my model db.session.add(task)

我正在使用Flask+sqlalchemy+MySQL编写多线程应用程序

SQL炼金术设置:

SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_POOL_SIZE = 200
SQLALCHEMY_MAX_OVERFLOW = 50
SQLALCHEMY_POOL_RECYCLE = 5
我的应用程序最多可以同时运行300个线程。在每个线程中都有一些DB用法,如:

# task == my model
db.session.add(task)

task.progress += 1
db.session.commit()
还有一些更复杂的代码

在3-5分钟的工作之后,我的MySQL将因为连接太多而消失。 在每个线程完成其工作后,我尝试了db.session.close()和db.session.bind.dispose()。但这并没有帮助,在3-5分钟内将有200多个连接,MySQL将死亡

如何正确管理此连接?

您可以使用这种方式

首先转到mysql服务器并更改max_connections选项

设置全局最大连接数=1000

你可以用这种方法

首先转到mysql服务器并更改max_connections选项


设置全局最大连接数=1000

如果您需要300个单独的连接,那么就没有办法解决这个问题。如果不这样做,则应降低池大小。您正在允许SQLAlchemy连接那么多(250)个连接。此常量SQLAlchemy\u POOL\u SIZE=200不会改变任何内容。即使它等于200,实际的mysql连接也可能是800+,这意味着您有多个池,这意味着您正在使用某种类型的多进程。您需要将其降低到(MySQL可以处理的最大进程数)/(您拥有的进程数)。如果您需要300个单独的连接,则无法解决此问题。如果不这样做,则应降低池大小。您正在允许SQLAlchemy连接那么多(250)个连接。此常量SQLAlchemy\u POOL\u SIZE=200不会改变任何内容。即使它等于200,实际的mysql连接也可能是800+,这意味着您有多个池,这意味着您正在使用某种类型的多进程。您需要将其降低到(MySQL可以处理的最大进程数)/(您拥有的进程数)。