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 实例的开销,怎么反而消耗更多数据库连接,而且这个项目的负载很低,怎么可能把整个连接池都消耗殆尽呢?

今天在周会上谈了这个怪问题,后来突然想到:每个 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
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes架构为什么是这样的?

小编序&#xff1a;在上周发布的《从“鸿沟理论”看云原生&#xff0c;哪些技术能够跨越鸿沟&#xff1f;》一文中&#xff0c;灵雀云CTO陈恺表示&#xff1a;Kubernetes在云计算领域已经成为既定标准&#xff0c;进入主流市场&#xff0c;最新版本主要关注在稳定性、可扩展性方…

开源 , KoobooJson一款高性能且轻量的JSON框架

在C#领域&#xff0c;有很多成熟的开源JSON框架&#xff0c;其中最著名且使用最多的是 Newtonsoft.Json ,然而因为版本迭代,其代码要兼容从net2.0到现在的最新的net框架,并且要支持.net平台下的其它语言,所以最新发布版本的Newtonsoft.Json其dll大小接近700k,另一方面,因为其复…

分布式系统的构建原则

什么是构建一个可维护和可扩展的系统的意义&#xff1f;在早期&#xff0c;一个系统的形态&#xff0c;只是满足用户和服务器资源之间的通道&#xff0c;唯一要扩展和维护的是系统后面的资源&#xff0c;保证资源的可用和够用&#xff0c;而系统本身的压力并不大。系统设计跟我…

可持久化4--可持久化并查集

可持久化并查集 可持久化并查集 按秩合并并查集 可持久化数组 首先并查集不能采用路径压缩&#xff0c;这是因为一次findR操作中&#xff0c;fa数组的很多位置&#xff08;u->ru&#xff09;会发生修改&#xff0c;由于每次修改都需要在可持久化数组上复制产生log个新结…

ASP.NET Core 2.2中的Endpoint路由

在ASP.NET Core 2.2中&#xff0c;新增了一种路由&#xff0c;叫做Endpoint&#xff08;终结点&#xff09;路由。本文将以往的路由系统称为传统路由。本文通过源码的方式介绍传统路由和Endpoint路由部分核心功能和实现方法&#xff0c;具体功能上的差异见官方文档。在升级到AS…

AtCoder2063 [AGC005E] Sugigma The Showdown(博弈论)

problem 洛谷链接 solution 考虑一条 (u,v)(u,v)(u,v) 的红边&#xff0c;在蓝树上 u,vu,vu,v 两点距离 ≥3\ge 3≥3。 如果先手到达 u,vu,vu,v 其中任何一点且下一步后手行动无法抓住先手&#xff0c;那么这个游戏就将进入死循环了。 通过画图&#xff0c;你会发现这个结…

基于ASP.NET Core的模块化设计: 虚拟文件系统

土牛亲自录制的本文介绍视频Abp中文网(https://cn.abp.io/)提供翻译字幕基于ASP.NET Core的模块化设计: 虚拟文件系统简介创建模块化的应用程序很困难. 构建模块化的用户界面更加困难. 需要单独开发模块的页面和组件,但是最后要把它们集成在一起像单个UI一样创建这样的模块化架…

[学习笔记] 乱世之神杀疯了 —— K-D tree

文章目录K-D tree建树合并插入删除查询(估价函数)旋转坐标系题目练习[SDOI2012]最近最远点对[Violet]天使玩偶/SJY摆棋子[CQOI2016]K远点对[国家集训队]JZPFARThe closest M points简单题巧克力王国[BOI2007]Mokia 摩基亚[CH弱省胡策R2]TATT[BZOJ3815]卡常数[NOI2019]弹跳A sim…

【春华秋实】.NET Core之只是多看了你一眼

技术学习是一件系统性的事情&#xff0c;如果拒绝学习&#xff0c;那么自己就会落后以至于被替代。.NET也是一样&#xff0c;当开源、跨平台成为主流的时候&#xff0c;如果再故步自封&#xff0c;等待.NET的就是死路一条&#xff0c;幸好.NET Core问世了&#xff0c;社区反响积…

[SDOI2010]粟粟的书架

[SDOI2010]粟粟的书架 题意&#xff1a; 一个R * C的矩阵&#xff0c;每个位置都有个数page[ij]&#xff0c;现在选定一个小矩阵范围(给左上角坐标&#xff0c;和右下角坐标)&#xff0c;问这个范围内的数总和是否大于h&#xff0c;如果大于h的话最少选几个数aij 对于50%的数…

基于Asp.Net Core的简单社区项目源代码开源

2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0EF CORE 3.0开发使用vs2019 sqlserver 2017(数据库脚本最低支持sql server 2012/)使用步骤:1.下载相关开发工具2.运行数据库脚本目录下的相关脚本3.默认前端账号密码: 18812345678 1234564.默认后台账号密码: admin 123456开…

[学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理

群与子群 <G,op><G,op><G,op> 是一个群需要满足以下条件&#xff1a; opopop 是一个满足结合律的二元运算&#xff0c;如 *&#xff0c;。GGG 是一个集合&#xff0c;存在单位元 eee。GGG 中所有元素都有逆元。即 GGG 对 opopop 运算封闭&#xff0c;封闭简单…

为什么从前那些.NET开发者都不写单元测试呢?

楔子四年前我虽然也写了很多年代码&#xff0c;由于公司虽然规模不小&#xff0c;却并非一家规范化的软件公司&#xff0c;因此在项目中严格意义上来说并没有架构设计、也不写单元测试&#xff0c;后来有幸加入了一家公司&#xff0c;这家公司虽然也是一家小公司&#xff0c;但…

使用 xUnit 编写 ASP.NET Core 单元测试

还记得 .NET Framework 的 ASP.NET WebForm 吗&#xff1f;那个年代如果要在 Web 层做单元测试简直就是灾难啊。.NET Core 吸取教训&#xff0c;在设计上考虑到了可测试性&#xff0c;就连 ASP.NET Core 这种 Web 或 API 应用要做单元测试也是很方便的。其中面向接口和依赖注入…

记录使用 Cake 进行构建并制作 nuget 包

前段时间折腾了一下&#xff0c;总算是把我自己的图片缓存控件&#xff08;https://github.com/h82258652/HN.Controls.ImageEx&#xff09;发布到了 nuget 上&#xff0c;目前已经进入一个比较稳定的版本了&#xff0c;基本没有很严重的 bug 了。其实核心代码早就写完了&#…

DDD领域驱动设计理论篇 - 学习笔记

一、Why DDD?在加入X公司后&#xff0c;开始了ASP.NET CoreDockerLinux的技术实践&#xff0c;也开始了微服务架构的实践。在微服务的学习中&#xff0c;有一本微软官方出品的《.NET微服务&#xff1a;容器化.NET应用架构指南》是我们学习的葵花宝典&#xff0c;纵观微软官方放…

.NetCore使用skywalking实现实时性能监控

一、简介很久之前写了一篇 《.Net Core 2.0 InfluxDBGrafanaApp Metrics 实现跨平台的实时性能监控》关于NetCore性能监控的文章&#xff0c;使用InfluxdbAppMetrics进行项目性能监控&#xff0c;由于技术有限&#xff0c;在正式环境使用一段时间后&#xff0c;莫名的AppMetric…

netcore开发windows普通服务(非Web)并一键发布到服务器

netcore下开发windows服务如果是web项目的话&#xff0c;由于aspnetcore本身是支持的&#xff0c;把默认的host.Run改为host.RunAsService就可以了。但是普通的netcore的控制台项目我终于找到了如下方式来实现&#xff1a;Microsoft.Extensions.HostingSystem.ServiceProcess.S…

Hopping Rabbit

Hopping Rabbit 题意&#xff1a; 给你n个矩阵&#xff0c;每个矩阵(给出左上标和右下标)&#xff0c;现在让你给出一个点的位置&#xff0c;这个点每次只能上下左右四个方向移动&#xff0c;且移动距离为d&#xff0c;是否存在一个这样的点&#xff0c;其所有落点都不在矩阵…

直播预告 - 微软MVP为你揭秘Visual Studio 2019新特性

作为"宇宙第一IDE“的Visual Studio集成开发环境&#xff0c;已经经历了超过十几年的迭代成为一款功能丰富且高效的开发工具&#xff0c;微软自己给Visual Studio 的定位是 “更快、更可靠&#xff0c;对个人和团队更具生产力&#xff0c;更易于使用&#xff0c;并且更容易…