我创建了Flask
WSGI应用程序,它使用gunicorn
作为WSGI服务器,对于DB,它通过Flask SQLAlchemy
扩展使用PostgreSQL
。这些都是在Heroku
上托管的。
gunicorn配置
Heroku PostgreSQL configuration
对于其他一切,都使用默认配置。
我得到了一个错误:sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: too many connections for role <id>
。显然,我超过了允许的DB连接数。
我试过这些东西来修复它:
poolclass
设置为NullPool
;pool_recycle
设置为2。即使在超过2秒之后,连接的数量仍然相同;session.close()
与engine.dispose()
;max_overflow = 0
,SQLALchmey pool_size = 10
(我得到这个错误:sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 0 reached, connection timed out, timeout 30
)。这些都不管用。我仍然得到这个错误,即使是最低配置(一个工人与18个连接)。我真的开始不明白到底发生了什么。
我认为它是这样工作的:每个工人都有自己的引擎实例,每个引擎都有自己的池大小。因此,如果有两个带有引擎默认配置(池大小为5)的工作人员,那么我们有2*5= 10到DB的最大连接。但看起来真的不是这样的。
问题
SQLAlchemy
池如何与gevent
工作人员一起工作?也就是说,如何计算最大的DB连接数?很抱歉有太多的问题,但这真的让我很沮丧。
发布于 2022-08-24 13:27:25
在构建这个项目时,我一直在努力解决同样的问题,而我最终能够解决这个问题的唯一方法是将create_engine
方法转化为全局变量和如果它已被创建,则为。
https://stackoverflow.com/questions/61197228
复制相似问题