使用 Uvicorn 的 FastAPI 应用程序中的 SQLAlchemy QueuePool 溢出问题

问题描述 投票:0回答:1

我有一个使用 FastAPI、Uvicorn、SQLAlchemy 和 MySQL 的 FastAPI 应用程序。当我向 API 发送大量请求时,遇到错误:

sqlalchemy.exc.TimeoutError: QueuePool limit of size 10 overflow 20 reached

配置详情: 我已配置数据库设置如下:

engine = create_engine(settings.DATABASE_URI, pool_pre_ping=True, pool_size=10, max_overflow=20)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

端点数据库访问: 端点内的数据库访问使用名为 get_db() 的依赖项进行管理,如下所示:


from database import SessionLocal

def get_db():
    db = SessionLocal() 
    try:
        yield db
    finally:
        db.close()

考虑到我在 Uvicorn 中仅使用一个工作线程,我希望应用程序能够按顺序处理请求。然而,尽管有这样的设置,我还是对池中同时存在多个活动连接感到困惑。我已经检查了我的配置和使用模式,但无法查明为什么会出现此并发问题。

sqlalchemy fastapi connection-pooling uvicorn
1个回答
0
投票

在@FiddlingAway 评论的后面。例如,如果您的连接遇到错误,您可能不会关闭连接,它们就会建立起来。您可以使用上下文管理器来更好地处理数据库连接,并确保它在完成后始终关闭:

def get_db():
    with SessionLocal() as db: 
        try:
            yield db
        except Exception as err:
            # log your error
            # print(err) # for dev/testing
            db.rollback()
        finally:
            db.close()
© www.soinside.com 2019 - 2024. All rights reserved.