zoukankan      html  css  js  c++  java
  • 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";
  • 相关阅读:
    Linux 文件取交集 并集 差集
    阿里花名推荐
    Linux bg fg命令的使用
    python导入自己创建的本地包报错
    数值计算方法
    数据库oracle回顾
    使用visualBox创建Centos/7,搭建docker,安装mysql,及远程连接
    git 合并分支到master
    git 本地文件修改错误,重新取回服务器历史版本
    三本不错的计算机专业书籍(需求分析,开发实务,恶意代码分析)
  • 原文地址:https://www.cnblogs.com/51net/p/12454837.html
Copyright © 2011-2022 走看看