EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽
发布时间:2019-02-18 22:05,
浏览次数:1152
, 标签:
EF
Core
DbContextPool
DbContextPool 是 ASP.NET Core 2.1 引入的新特性,可以节省创建 DbContext 实例的开销,但没有想到其中藏着一个小坑。
最近有一个 ASP.NET Core 项目持续运行一段时间后日志中就会出现数据库连接池达到最大连接数限制的错误:
System.InvalidOperationException: Timeout expired. The timeout period elapsed
prior to obtaining a connection from the pool. This may have occurred because
all pooled connections were in use and max pool size was reached. at
System.Data.Common.ADP.ExceptionWithStackTrace(Exception e)
开始以为是哪个地方的代码造成 DbContext 不能正常 Dispose ,但在代码中没有找到任何相关线索。后来实在没有其他可以怀疑的地方,唯有
DbContextPool ,于是尝试去掉 DbContextPool ,结果错误就消失了。果然是 DbContextPool 引起的,但让人纳闷的是
DbContextPool 本来就是为了节省创建 DbContext
实例的开销,怎么反而消耗更多数据库连接