如何知道网站后台地址,聊城优化网站建设,阿里云 wordpress 响应时间,腾讯云cdn wordpressDbContextPool 是 ASP.NET Core 2.1 引入的新特性#xff0c;可以节省创建 DbContext 实例的开销#xff0c;但没有想到其中藏着一个小坑。最近有一个 ASP.NET Core 项目持续运行一段时间后日志中就会出现数据库连接池达到最大连接数限制的错误#xff1a;System.InvalidOpe… 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 实例的开销怎么反而消耗更多数据库连接而且这个项目的负载很低怎么可能把整个连接池都消耗殆尽呢今天在周会上谈了这个怪问题后来突然想到每个 DbContext 实例都会占用一个数据库连接SqlConnection不启用 DbContextPool 的时候请求一结束对应 DbContext 实例就被 Dispose 数据库连接就会被放回连接池。而使用 DbContextPool 的时候请求结束后 DbContext 不会被 Dispose 而是被放回 DbContextPool DbContext 被放回属于自己的池中就意味它对应的数据库连接不会被放回它所属的连接池。DbContextPool 中的每一个 DbContext 都对应一个数据库连接DbContextPool 中每多一个 DbContext 数据库连接池中就会少一个数据库连接。当这两个池的大小不一样且 DbContextPool 大于数据库连接池问题就来了DbContextPool 根据自家池假设是128子的大小畅快地向池中填 DbContext 浑然不顾数据库连接池的大小(假设是100)当填到第 101 个 DbContext 时就会出现上面的错误。这个项目中用的都是默认设置是不是默认设置就会触发这个问题呢查看 DbContextPool 的 实现源码 发现池的默认大小限制是 128public static IServiceCollection AddDbContextPoolTContext( [NotNull] this IServiceCollection serviceCollection, [NotNull] ActionDbContextOptionsBuilder optionsAction,int poolSize 128)where TContext : DbContext AddDbContextPoolTContext, TContext(serviceCollection, optionsAction, poolSize);查看 SqlConnention 的 实现源码 发现连接池的默认大小限制是 100internal const int Max_Pool_Size 100;默认设置就会触发问题实实在在的一个小坑。知道了原因解决起来就很简单了将 DbContextPool 的 poolSize 设置为小于数据库连接池的 Max_Pool_Sizeservices.AddDbContextPoolJobDb(option option.UseSqlServer(Configuration.DbConnectionStr()), poolSize: 64);原文地址https://www.cnblogs.com/dudu/p/10398225.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com