长话短说

  上个月公司上线了一个物联网数据科学项目,我主要负责前端接收设备Event,并提供模型参数下载(数据科学团队会优化参数)。WebApp部署在Azure,模型参数使用Azure SQL Server存储。

最近从灰度测试转向全量部署之后,日志中时常出现:SQL Session会话超限的报错。

19/12/18 20:41:18 [Error].[Microsoft.EntityFrameworkCore.Query].[][0HLS3MS83SC3K:00000004].[http://******/api/v1/soc-prediction-model/all].[].[GetModeParameters]
An exception occurred while iterating over the results of a query for context type 'Gridsum.SaicEnergyTracker.CarModelContext'.
Microsoft.Data.SqlClient.SqlException (0x80131904): Resource ID : 2. The session limit for the database is 300 and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.
Changed database context to 'saic-carmodel'.
Changed language setting to us_english.at Microsoft.Data.ProviderBase.DbConnectionPool.CheckPoolBlockingPeriod(Exception e)at Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)at Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)at Microsoft.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen()
--- End of stack trace from previous location where exception was thrown ---at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(Boolean errorsExpected, CancellationToken cancellationToken)at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnectionAsync(Boolean errorsExpected, CancellationToken cancellationToken)at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenAsync(CancellationToken cancellationToken, Boolean errorsExpected)at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.AsyncQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()

排查

  Azure上使用的是SQL Server Basic Edition(好歹也是付费版),全量发布至今,日均SQL访问次数约为10000,查询了Azure SQL的使用限制文档:

一句话:付费级别和计算资源大小决定了Azure SQL最大会话数/请求数。

若要缓解,要么升级硬件资源,要么优化查询利用率。

本次使用EFCore操作SQL Server的方式, 是官方默认用法:

  • 依赖注入框架注册一个自定义的 DbContext类型

  • 在Controller构造函数中获取 DbContext实例

这意味着每次请求都会创建一个 DbContext实例, 可以想象到

① 在高并发请求下,连接数不断累积,最终某时刻会超过 Azure 的连接限制数量。

② 频繁创建和销毁 DbContext 实例,影响App Service自身性能。

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

services.AddDbContextPool<CarModelContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SQL")));

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

- 默认的连接池数量为 128

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

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

这么重要的使用方式竟然不在 EFCore Doc指南中默认演示,真是一个坑。

修改代码重新部署之后,历经几天测试,暂时未出现最开始的SqlException异常。

验证

回过头随机验证SQL Server会话中的有效连接数量:48

SELECT DEC.session_id, DEC.protocol_type, DEC.auth_scheme,DES.login_name, DES.login_time
FROM sys.dm_exec_sessions AS DESJOIN sys.dm_exec_connections AS DECON DEC.session_id = DES.session_id;

总结

①  提示EFCore2.0新推出的DbContextPool特性,有效提高SQL查询吞吐量

②  尝试使用SQL Server 内置脚本自证会话中有效连接数

+  https://stackoverflow.com/questions/48443567/adddbcontext-or-adddbcontextpool

+ https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0#dbcontext-pooling

使用DbContextPool提高EfCore查询性能相关推荐

  1. db2嵌套查询效率_提高 DB2 查询性能的常用方法

    提高 DB2 查询性能的常用方法 张大为 和 陈力 2007 年 9 月 28 日发布 简介 随着 DB2 应用的逐渐增多,越来越多的数据库开发人员在项目开发过程中都会遇到查询过于复杂,导致性能难以接 ...

  2. MySQL查询缓存设置提高MySQL查询性能

    首先看看MSYQL逻辑框架:图片来自高性能mysql 如果使用了QueryCache,当查询接收到一个和之前同样的查询,服务器将会从查询缓存中检索结果,而不是再次分析和执行相同的查询.这样就能大大提高 ...

  3. db2嵌套查询效率_提高DB2 查询性能的常用方法

    [IT168 技术文档]本文先对 DB2 提供的几种用于提高查询性能的相关工具和命令进行介绍,然后根据笔者的工作经验介绍一些常用的技巧和方法来提高查询性能.主要集中于如何创建和维护索引.改写查询以及改 ...

  4. mysql 查询缓存设置_MySQL查询缓存设置 提高MySQL查询性能

    从 MySQL4开始,出现了QueryCache查询缓存,如果使用了QueryCache,当查询接收到一个和之前同样的查询,服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询.这样就大大提 ...

  5. 提高sql查询性能-使用instr函数替换like

    使用like查询时比较慢,使用oracle的instr函数可以提高查询的效率. 使用like: select f1.htbh as "htbh",f2.syqr as " ...

  6. ABAP 查询性能提高之我见

    索引简介: 各位应该都知道,我们说到数据库的查询速度优化问题,不得不提到索引,它是提高查询性能的重要方面(当然同时它会影响其它修改类SQL的性能).通俗的讲,就像我们读一本书不得不有个目录,索引就相当 ...

  7. Elasticsearch提高查询性能的方法

    ES性能并没有想象中那么好.很多时候数据量大了,特别是有几亿条数据的时候,可能第一次搜索的时候,是5-10s,后面反而就快了,可能就几百毫秒. 说实话,ES 性能优化不要期待着随手调一个参数,就可以万 ...

  8. 字节面试:谈谈索引为什么能提高查询性能?

    前言 昨天,有个女孩子问我提高数据库查询性能有什么立竿见影的好方法? 这简直是一道送分题,我自豪且略带鄙夷的说,当然是加「索引」了. 她又不紧不慢的问,索引为什么就能提高查询性能. 这还用问,索引就像 ...

  9. 索引为什么能提高查询性能....

    前言 昨天,有个女孩子问我提高数据库查询性能有什么立竿见影的好方法? 这简直是一道送分题,我自豪且略带鄙夷的说,当然是加「索引」了. 她又不紧不慢的问,索引为什么就能提高查询性能. 这还用问,索引就像 ...

最新文章

  1. 晒一下MAC下终端颜色配置
  2. Java之杨辉三角的实现
  3. java标量替换_JAVA逃逸分析、栈上分配、标量替换、同步消除
  4. 用java画爱心图_C++和Java命令行绘制心形图案
  5. Flutter进阶—质感设计之标签栏
  6. npm安装vue-cli时速度慢,fetchMetadata经常卡住并报异常
  7. linux 软件源码安装教程,linux源码安装软件步骤
  8. CronTrigger 示例 1
  9. 轴承的Abaqus静态分析
  10. 批量创建文件夹 在批量创建的文件夹下创建两个子文件夹
  11. WMware15和虚拟机Win10镜像文件网盘分享
  12. .satan勒索病毒加密文件恢复手记
  13. python+vue+django高校教职工人事档案管理系统
  14. [NOI2010] 航空管制 (构反图+拓扑)
  15. 程序员面试必备的八大数据结构
  16. Android中自定义弧形的seekbar
  17. 一文读懂知识图谱的主要技术
  18. html写文章发布,写文章.html
  19. Python基础内容训练11(面向对象进阶)
  20. 计算机网络之计算机网络概述

热门文章

  1. 关于使用 jquery Validate 使用出现的问题
  2. Windows 10的下一个更新将在您观看视频时隐藏通知
  3. 浏览器显示无法解析服务器的DNS地址,使用搜狗浏览器时突然弹出无法解析服务器的DNS地址该如何处理...
  4. 光纤熔接过程详细说明
  5. 用java调用.net的wcf其实还是很简单的
  6. oracle dba 手动创建数据实例
  7. bitmapdata的知识点
  8. 深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法
  9. javascript理论篇(详情见地址)
  10. 【读书笔记】《编写高效的JavaScript程序》