📚
Hoa Framework
  • 一、框架指南
  • 二、功能特性
  • 三、源码结构
  • 四、代码规范
  • 五、入门指南
  • 六、依赖注入/控制反转
  • 七、控制器和服务
  • 八、对象映射指南
  • 九、数据库操作指南
    • 9.1、正向工程(Code First)
    • 9.2、逆向工程(Database First)
    • 9.3、关于仓储(IRepository)
    • 9.4、增删改操作
    • 9.5、查询操作
    • 9.6、DataSet、DataTable 操作
    • 9.7、查询结果集映射
    • 9.8、批量增删改操作
    • 9.9、存储过程、视图、函数操作
    • 9.10、工作单元和事务
    • 9.11、多上下文、读写分离
    • 9.12、切面上下文(TangentDbContext)
    • 9.13、其他操作
    • 9.14、EF Core 高性能
    • 9.15、常见错误
  • 十、开放接口指南
    • 10.1、RESTFul 和 Swagger
    • 10.2、规范化返回值
  • 十一、数据校验
  • 十二、安全授权
  • 十三、异常处理
  • 十四、日志管理
  • 十五、配置管理
  • 十六、缓存管理
  • 十七、内置工具类
    • 17.1、数据加解密
  • 十八、跨域处理
  • 十九、筛选拦截器(未)
  • 二十、进程服务(Daemon)
  • 二十一、编写测试
    • 20.1、单元测试
    • 20.2、基准测试
    • 20.3、性能测试
  • 二十二、托管部署
    • 22.1、IIS 托管部署
    • 22.2、Nginx 托管部署
    • 22.3、Docker 容器部署
  • 二十三、性能分析(MiniProfiler)
  • 二十四、其他功能
    • 23.1、第三方包管理
    • 23.2、文件上传下载
    • 23.3、Razor 视图引擎
    • 23.4、生成客户端请求代码
    • 23.5、快捷操作
  • 二十五、Docker 容器化
    • 25.1、Docker 介绍
    • 25.2、Docker 安装
    • 25.3、Docker 安装服务
    • 25.4、Docker 常用命令
    • 25.6、Docker run 常用命令
    • 25.7、Docker-Compose 介绍
    • 25.8、docker-compose.yml
    • 25.9、Docker-Compose 常用命令
    • 25.10、Docker-Compose 转换 docker run
    • 25.11、Docker 构建自己的镜像
    • 25.12、Dockerfile指南
    • 25.13、Dockerfile 常用命令
    • 25.14、Dockerfile 打包、上传、分享
    • 25.15、Docker 数据卷
    • 25.16、Docker 域网络
    • 25.17、Docker + Nginx 实现分布式集群、负载均衡
  • 二十六、DevOps 持续部署集成
    • 26.1、DevOps 介绍
    • 26.2、持续集成、交付、部署
    • 26.3、Jenkins 介绍
    • 26.4、Jenkins 安装
    • 26.5、Jenkins 初始化
    • 26.6、Jenkins 实战演练
    • 26.7、Jenkis 项目配置
    • 26.8、Jenkins 插件
  • 二十七、OpenXml/Excel 操作
  • 二十八、SaaS 多租户
  • 二十九、Git 代码管理
    • 29.1、Git 介绍
    • 29.2、Git 安装
    • 29.3、Git 基础配置
    • 29.4、Git 工作流程
    • 29.5、Git 重要概念
    • 29.6、Git 创建仓库
    • 29.7、Git 基本操作
    • 29.8、Git 分支管理
    • 29.9、Git 查看提交历史
    • 29.10、Git 标签
    • 29.11、Git 拉取/获取/推送
    • 28.12、Git GUI工具
    • 29.13、Git 私有化部署
    • 29.14、Git 推荐开发模式
    • 29.15、Svn 转 Git
  • 贡献代码
  • 更新日志
由 GitBook 提供支持
在本页
  • 高性能建议
  • 将DbContext分成多个子DbContext
  • 启用行版本控制功能

这有帮助吗?

  1. 九、数据库操作指南

9.14、EF Core 高性能

数据库操作是线上系统的核心,对系统的响应快慢也起着根本性的作用。

高性能建议

  • 请以异步方式调用所有数据访问 api。

  • 检索的数据不是必需的。 编写查询以仅返回当前 HTTP 请求所必需的数据。

  • 如果数据可以接受,请考虑缓存经常访问的从数据库或远程服务检索的数据。 使用 MemoryCache 或 microsoft.web.distributedcache ,具体取决于方案。

  • 尽量减少网络往返次数。 目标是使用单个调用而不是多个调用来检索所需数据。

  • 在访问数据时,请不要在 Entity Framework Core 中使用无跟踪查询。 EF Core 可以更有效地返回无跟踪查询的结果。 筛选和聚合 LINQ 查询(例如, .Where使用.Select、或.Sum语句),以便数据库执行筛选。

  • 请考虑 EF Core在客户端上解析一些查询运算符,这可能导致查询执行效率低下。

  • 不要对集合使用投影查询,这可能会导致执行 "N + 1" 个 SQL 查询。

  • 使用 DbContextPool 池来管理 DbContext,类似 ADO.NET 的连接池。

  • 手动或显式编译的查询 API,允许应用程序缓存查询转换,使其可仅被计算一次并执行多次。

// Create an explicitly compiled query
private static Func<CustomerContext, int, Customer> _customerById =
    EF.CompileQuery((CustomerContext db, int id) =>
        db.Customers
            .Include(c => c.Address)
            .Single(c => c.Id == id));

// Use the compiled query by invoking it
using (var db = new CustomerContext())
{
   var customer = _customerById(db, 147);
}

将DbContext分成多个子DbContext

正常情况下,我们的系统只有一个继承 DbContext 的类,也就是我们所有模型、存储过程、视图、函数等都是写在这个类中。随着系统越来越复杂,这个类也就越来越大,这样就会大大影响 DbContext 首次冷加载的时候会加载所有定义的模型、存储过程、视图、函数等。

所以、建议我们把系统划分成多个子模块,每一个子模块有自己独立的 DbContext 类,这样冷加载的性能大大提升,数据库操作也就响应越来越快!

启用行版本控制功能

-- 设置为单用户
ALTER DATABASE AlliantDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 开启行版本(事务级)
ALTER DATABASE AlliantDB SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
-- 开启语句级行版本
ALTER DATABASE AlliantDB SET READ_COMMITTED_SNAPSHOT ON WITH no_wait
GO
-- 设置为多用户
ALTER DATABASE AlliantDB SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO
上一页9.13、其他操作下一页9.15、常见错误

最后更新于4年前

这有帮助吗?

具体怎么实现多个 DbContext 查查阅 章节。

9.11、多上下文、读写分离