You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI接入Async SQLAlchemy 1.4+后多请求共享session报错如何解决

问题根源

你在模块顶层直接调用asyncio.run(init_connection())执行数据库初始化,这会在模块加载阶段创建一个独立的事件循环,初始化的数据库引擎、session工厂都会绑定这个临时事件循环。等FastAPI启动后,ASGI服务器(hypercorn)会创建新的事件循环运行服务,所有请求拿到的session都是绑定旧事件循环的无效资源,并发场景下就会出现连接复用冲突,抛出another operation is in progress的报错。

修复步骤

  1. 删除模块顶层的初始化调用
    删掉代码里的asyncio.run(init_connection())行,避免提前创建无效的事件循环资源。

  2. 将初始化逻辑移到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()
  1. 调整引擎配置(高并发场景建议加)
    给异步引擎配置合理的连接池参数,避免连接不够用导致的冲突:
# 修改你的引擎初始化代码
engine = create_async_engine(
    Config.RDS_DB_URL,
    pool_size=20,  # 调整为匹配业务并发量的数值
    max_overflow=0,
    echo=False
)
  1. 排查全局session缓存
    检查所有业务代码,确保没有将依赖注入拿到的session赋值给全局变量、类静态变量做复用,保证每个请求的session都是通过Depends(get_session)获取,请求结束后会被自动销毁。

验证逻辑

修改完成后重启服务,并发请求时每个请求都会从绑定当前事件循环的session工厂拿到独立的session,冲突报错会消失。

内容的提问来源于stack exchange,提问作者Manu Sisko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:36:01