FastAPI接入Async SQLAlchemy 1.4+后多请求共享session报错如何解决
问题根源
你在模块顶层直接调用asyncio.run(init_connection())执行数据库初始化,这会在模块加载阶段创建一个独立的事件循环,初始化的数据库引擎、session工厂都会绑定这个临时事件循环。等FastAPI启动后,ASGI服务器(hypercorn)会创建新的事件循环运行服务,所有请求拿到的session都是绑定旧事件循环的无效资源,并发场景下就会出现连接复用冲突,抛出another operation is in progress的报错。
修复步骤
删除模块顶层的初始化调用
删掉代码里的asyncio.run(init_connection())行,避免提前创建无效的事件循环资源。将初始化逻辑移到FastAPI启动事件
在你创建FastAPI实例的文件中,新增启动事件钩子,在ASGI服务的事件循环中执行数据库初始化:
from fastapi import FastAPI from your_db_module import init_connection app = FastAPI() @app.on_event("startup") async def startup_event(): await init_connection()
- 调整引擎配置(高并发场景建议加)
给异步引擎配置合理的连接池参数,避免连接不够用导致的冲突:
# 修改你的引擎初始化代码 engine = create_async_engine( Config.RDS_DB_URL, pool_size=20, # 调整为匹配业务并发量的数值 max_overflow=0, echo=False )
- 排查全局session缓存
检查所有业务代码,确保没有将依赖注入拿到的session赋值给全局变量、类静态变量做复用,保证每个请求的session都是通过Depends(get_session)获取,请求结束后会被自动销毁。
验证逻辑
修改完成后重启服务,并发请求时每个请求都会从绑定当前事件循环的session工厂拿到独立的session,冲突报错会消失。
内容的提问来源于stack exchange,提问作者Manu Sisko
相关产品推荐
相关产品推荐

