EFCore 使用DbContextPool提高EfCore查询性能
EFCore2.0 为DbContext引入新的注册方式:透明地注册了 DbContext实例池
services.AddDbContextPool<UserModelContext>(options => options.UseSqlServer(Configuration.GetConnectionString("sqlstring")));
一如既往支持lambda方式注册连接字符串
- 默认的连接池数量为 128
- 每次使用完DbContext不会释放对象,而是重置并回收到DBContextPool
Web程序中通过重用池中DbContext实例可提高高并发场景下的吞吐量, 这在概念上类似于ADO.NET Provider原生的连接池操作方式,具有节省DbContext实例化成本的优点, 这也是EFCore2.0 其中一个性能亮点。
验证SQL Server会话中的有效连接数SQL:
SELECT DEC.session_id, DEC.protocol_type, DEC.auth_scheme, DES.login_name, DES.login_time FROM sys.dm_exec_sessions AS DES JOIN sys.dm_exec_connections AS DEC ON DEC.session_id = DES.session_id;
需要注意的一个坑: 查看 SqlConnention 的 实现源码 发现连接池的默认大小限制是 100
EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽 - dudu - 博客园 https://www.cnblogs.com/dudu/p/10398225.html
总结:
DbContextPool 的连接池数量一定要小于数据库默认的连接池100!
知道了原因,解决起来就很简单了,解决办法:
1、将 DbContextPool 的 poolSize 设置为小于数据库默认连接池的 Max_Pool_Size
services.AddDbContextPool<JobDb>(option =>
option.UseSqlServer(Configuration.DbConnectionStr()),
poolSize: 64);
2、修改连接字符串,重新制定数据库的连接字符串大小。
比如:
string connstr="Server=joe;Database=AdventureWorks;User ID=sa;Password=test;pooling=true;connection lifetime=0;min pool size = 10;max pool size=512";
作者:阿笨
【官方QQ一群:跟着阿笨一起玩NET(已满)】:422315558
【官方QQ二群:跟着阿笨一起玩C#(已满)】:574187616
【官方QQ三群:跟着阿笨一起玩ASP.NET(已满)】:967920586
【官方QQ四群:Asp.Net Core跨平台技术开发(可加入)】:829227829
【官方QQ五群:.NET Core跨平台开发技术(可加入)】:647639415
【网易云课堂】:https://study.163.com/provider/2544628/index.htm?share=2&shareId=2544628
【腾讯课堂】:https://abennet.ke.qq.com
【51CTO学院】:https://edu.51cto.com/sd/66c64
【微信公众号】:微信搜索:跟着阿笨一起玩NET