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 的 实现源码 发现池的默认大小限制是 128

public static IServiceCollection AddDbContextPool<TContext>(    [NotNull] this IServiceCollection serviceCollection,    [NotNull] Action<DbContextOptionsBuilder> optionsAction,int poolSize = 128)where TContext : DbContext    => AddDbContextPool<TContext, TContext>(serviceCollection, optionsAction, poolSize);

查看 SqlConnention 的 实现源码 发现连接池的默认大小限制是 100

internal const int Max_Pool_Size = 100;

默认设置就会触发问题,实实在在的一个小坑。

知道了原因,解决起来就很简单了,将 DbContextPool 的 poolSize 设置为小于数据库连接池的 Max_Pool_Size

services.AddDbContextPool<JobDb>(option =>    option.UseSqlServer(Configuration.DbConnectionStr()),     poolSize: 64);

原文地址:https://www.cnblogs.com/dudu/p/10398225.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽相关推荐

  1. ef mysql 连接数_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    原标题:EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 DbContextPool 是 ASP.NET Core 2.1 引入的新特性,可以节省创建 DbContext ...

  2. net core mysql 连接池_EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 发布时间:2019-02-18 22:05, 浏览次数:1152 , 标签: EF Core DbContextPool ...

  3. mysql事务锁导致tomcat崩溃_数据库连接池连接耗尽,导致tomcat请求无响应,呈现出假死状态...

    最困难的事情就是认识自己! 个人网站 ,欢迎访问! 前言:最近,测试部门的同事找到我,说他们测试时,没一会就发现服务接口请求一直无响应,Tomcat跟死掉了一样,也没有返回任何的错误响应,说让我赶紧排 ...

  4. 数据库连接池连接异常com.alibaba.druid.pool.GetConnectionTimeoutException

    数据库连接池连接异常com.alibaba.druid.pool.GetConnectionTimeoutException 参考文章: (1)数据库连接池连接异常com.alibaba.druid. ...

  5. Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索

    Alibaba Druid 源码阅读(五)数据库连接池 连接关闭探索 简介 在上文中探索了数据库连接池的获取,下面接着初步来探索下数据库连接的关闭,看看其中具体执行了那些操作 连接关闭 下面的具体的代 ...

  6. net core 小坑杂记之配置文件读取(不定期更新)

    其实很早就想写了,原想等积累差不多了再写的,但是发现遇到一个当时记下效果会比较好,所以就不定期更新这个系列了,后面获取会整个整理一下. 此篇记载net core入门时踩的一些坑,网上教程太少了,也不规 ...

  7. 数据库连接池连接数量配置多大合理

    前段时间在一个老项目中经历过一个问题:一个 Dubbo 服务,启动的时候慢的要死,后来看日志查原因整个过程一直在初始化数据库连接.一看数据库连接参数,连接池大小:1024. 很多入行晚的同学没有经历过 ...

  8. java使用数据库连接池连接MySQL/MariaDB--DBCP2

    如果每次操作数据库都需要重新连接数据库,那么会很浪费资源.因此建议使用数据库的连接池来满足多线程的数据库操作. Java中数据库连接池有多种实现方法,推荐使用DBCP,这是Apache 提供的数据库连 ...

  9. 数据库连接和数据库连接池连接

    数据库直连 方式:DriverManager 需要引入的jar包:我用的版本是mysql-connecton-java-5.1.7-bin.jar //1.加载驱动程序 Class.forName(& ...

最新文章

  1. 英国推6.5亿英镑网络安全战略 强化安全屏障
  2. python 词云手把手_手把手教你生成炫酷的词云
  3. Rabbitmq集群高可用部署详细
  4. 2021-05-15
  5. Visual C++ 6.0静态、动态链接库
  6. Domino下实现仿Google搜索提示效果
  7. 穷人的孩子真的早当家吗?
  8. java 权限管理与用户角色权限设计
  9. python分片上传_分片上传_分片上传_上传文件_Python_SDK 示例_对象存储 OSS - 阿里云...
  10. Google 开源的前端项目
  11. 【HTML——线条雨落】(效果+代码)
  12. Linux container hand-crafted
  13. 【云驻共创】华为云AI之用Python定制我的《本草纲目女孩》
  14. 华为路ws5200设置虚拟服务器,华为路由器WS5200如何设置上网 最详细的华为路由器WS5200上网设置方法教程...
  15. html表格去除间距,table 去掉 td之间间距
  16. CCCC天梯赛 L1-079 天梯赛的善良
  17. springboot多线程定时任务
  18. 修改一个公式让MACD指标更加准确,快速找到股票买点。
  19. 剑指offer-----两个队列实现一个栈(C++实现)
  20. mysql verycd,山寨精简版veryCD网站 simpleCD震撼上线

热门文章

  1. 杜鹃演绎奢华春装大片
  2. 【算法】LeetCode算法题-Maximum Subarray
  3. 运维前线:一线运维专家的运维方法、技巧与实践导读
  4. 各自用一句话来概括MVC、MVP、MVVM的差异特点
  5. 修炼九阴真经Windows Phone开发 (7):本地化应用程序栏Localizing an Application Bar 下...
  6. 【转载】DataKeyNames,DataKeys 用法浅谈
  7. 如何使用ASP.NET Core Web API实现短链接服务
  8. WPF 修改(优化)Menu菜单的样式
  9. Polly的7种策略
  10. ASP.NET Core 单元测试:如何 Mock HttpContext.Features.Get()