前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EFCore 使用DbContextPool提高EfCore查询性能

EFCore 使用DbContextPool提高EfCore查询性能

作者头像
跟着阿笨一起玩NET
发布2020-03-12 10:24:14
1.6K0
发布2020-03-12 10:24:14
举报
文章被收录于专栏:跟着阿笨一起玩NET

EFCore2.0 为DbContext引入新的注册方式:透明地注册了 DbContext实例池

代码语言:javascript
复制
services.AddDbContextPool<UserModelContext>(options => options.UseSqlServer(Configuration.GetConnectionString("sqlstring")));

一如既往支持lambda方式注册连接字符串

- 默认的连接池数量为 128

  - 每次使用完DbContext不会释放对象,而是重置并回收到DBContextPool

Web程序中通过重用池中DbContext实例可提高高并发场景下的吞吐量, 这在概念上类似于ADO.NET Provider原生的连接池操作方式,具有节省DbContext实例化成本的优点, 这也是EFCore2.0 其中一个性能亮点。

验证SQL Server会话中的有效连接数SQL:

代码语言:javascript
复制
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

代码语言:javascript
复制
services.AddDbContextPool<JobDb>(option =>
    option.UseSqlServer(Configuration.DbConnectionStr()), 
    poolSize: 64);

2、修改连接字符串,重新制定数据库的连接字符串大小。

比如:

代码语言:javascript
复制
   string connstr="Server=joe;Database=AdventureWorks;User ID=sa;Password=test;pooling=true;connection lifetime=0;min pool size = 10;max pool size=512";
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-03-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档