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

ASP.NET Core 6 API在Oracle中生成大量会话的问题咨询

问题解答

数据库会话何时启动?

EF Core中,Oracle数据库会话对应的是数据库连接,它不会在DbContext实例创建时启动,而是在你第一次执行数据库操作(比如DbSet<T>.ToList()、FirstOrDefault()这类查询操作)时,由EF Core从连接池中获取或创建新的数据库连接,此时Oracle才会建立对应的会话。

为什么全局注入DbContext还是会产生多个会话?

你提到DbContext是全局注入,但ASP.NET Core中默认的DbContext注入生命周期是Scoped(作用域)——这意味着每个HTTP请求都会创建一个独立的DbContext实例。每个DbContext在执行数据库操作时,会从Oracle连接池获取一个连接(对应一个会话),操作完成后,连接会被释放回连接池,但Oracle不会立即关闭这个会话,而是将其标记为闲置状态,留待后续请求复用。

这就是你看到大量闲置会话的核心原因:连接池为了提升性能,会保留一定数量的空闲连接,避免每次请求都重新建立连接的开销,这些空闲连接对应的Oracle会话就会处于闲置状态。

为什么限制到15个会话系统仍能正常运行?

理论上“一个会话满足需求”只适用于单线程、单请求的场景,但Web应用是多并发请求的环境。你限制15个会话后系统正常,说明你的应用并发请求峰值不超过15,连接池里的15个连接足够处理所有并发请求,闲置会话只是连接池的备用资源,实际并未被占用。

优化建议

  • 调整连接池大小:在Oracle连接字符串中设置Max Pool Size=15,强制连接池最多保留15个连接,这样Oracle会话数就会被控制在15以内,避免闲置会话过多。
  • 检查长时运行操作:排查是否存在慢查询或长时间未释放DbContext的场景(比如异步操作未正确等待),这类情况会导致连接长时间被占用,迫使连接池创建新的会话。
  • 配置Oracle闲置会话超时:在Oracle端设置用户的IDLE_TIME参数(例如ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10;,闲置10分钟自动断开会话),自动清理长时间闲置的会话。
  • 确认DbContext生命周期:不要随意将DbContext改为Singleton生命周期,DbContext不是线程安全的,多线程共享会引发数据一致性问题,Scoped是Web应用的正确选择。

内容的提问来源于stack exchange,提问作者Stephan Stieger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:06:07