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