百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

EF Core优化技巧之预热处理(预热膨胀系数高的材料有哪些)

ccwgpt 2024-10-07 07:06 24 浏览 0 评论

今天和听到同事们在讨论一个关于使用EFCore时,为什么第一次查询数据库总是很慢的原因。我们在工作中经常使用EFCore进行数据访问,但发现每次第一次查询都需要较长的时间,这给我们带来了困扰。因此,我们聚在一起,探讨了这个问题的原因和可能的解决方案。通过查询相关资料,于是就有了这篇博客,现在分享给有需要的你。#分享编程心得# #编程经验#

EFCore首次使用缓慢

在使用Entity Framework Core(EF Core)时,首次查询可能会比较慢,这是因为EF Core需要进行模型构建、元数据加载、数据库连接建立和查询计划生成等操作。那么有什么办法可以解决这个问题呢,答案之一就是使用EF Core的预热来处理问题。

什么是EF Core的预热问题?

EF Core是一个轻量级、可扩展的ORM(对象关系映射)框架,用于在.NET应用程序中处理数据库操作。在应用程序启动时,EF Core需要进行一些初始化操作,如构建模型、加载元数据和建立数据库连接等。这些操作会导致首次查询的耗时增加,影响应用程序的性能。当使用Entity Framework Core(EF Core)进行数据库操作时,会涉及以下几个操作:

  1. 模型构建(Model Building):在使用EF Core之前,需要定义领域模型(Domain Model),即表示数据库表格的CLR对象。可以使用属性注解、Fluent API或实现IEntityTypeConfiguration接口等方式来配置模型。在运行时,EF Core会根据模型定义生成相应的数据库表结构。
  2. 元数据加载(Metadata Loading):EF Core通过反射和模型构建过程中的元数据提供程序来加载模型的元数据。这些元数据包括实体类型的属性、关系、索引等信息。在第一次创建DbContext实例时,EF Core会从模型构建器中加载元数据。
  3. 数据库连接建立(Database Connection Establishment):当执行数据库操作时,EF Core会根据配置连接字符串(Connection String)建立与数据库的连接。连接字符串包含数据库服务器的地址、身份验证方式、数据库名称等信息。EF Core会根据连接字符串选择合适的数据库提供程序来建立连接。
  4. 查询计划生成(Query Plan Generation):当执行查询操作时,EF Core会将LINQ查询表达式或查询方法转换为相应的SQL查询语句。这个过程称为查询翻译(Query Translation)。EF Core会根据查询表达式和模型的元数据生成查询计划,包括选择合适的表格、列、关联以及执行顺序等。

上述的操作都是在第一次进行数据库查询时执行的,因此首次查询可能会比较慢。这是因为EF Core需要进行模型构建、元数据加载、数据库连接建立和查询计划生成等操作。为了优化应用程序的性能,可以采取预热操作,提前执行这些操作,从而减少首次查询的耗时。

预热EF Core的解决方案

为了解决EF Core的预热问题,我们可以采取以下措施来优化应用程序的性能:

1. 显式调用EnsureCreated方法

在EF Core 3.0及更高版本中,可以通过显式调用EnsureCreated方法来预先构建模型并加载元数据。这样,在第一次查询时,EF Core就不需要再执行这些操作,从而减少查询的耗时。示例代码如下:

using (var context = new MyDbContext())
{
    context.Database.EnsureCreated();
}

2. 执行迁移操作

如果应用程序使用了EF Core的迁移功能,我们可以在应用程序启动时执行迁移操作。这可以通过调用Database.Migrate方法来实现。该方法会执行所有的迁移操作,并初始化数据库中的表结构和数据。示例代码如下:

using (var context = new MyDbContext())
{
    context.Database.Migrate();
}

3. 预热连接池

EF Core使用连接池来管理数据库连接。在应用程序启动时,我们可以预先创建和配置一组数据库连接,以减少首次查询时连接建立的时间。这可以通过设置连接池的MinPoolSize属性和调用连接的Open方法来实现。示例代码如下:

var connectionString = "Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;";
for (int i = 0; i < 10; i++)
{
    var connection = new SqlConnection(connectionString);
    connection.Open();
    connection.Close();
}

测试预热与不预热的对比

为了验证预热操作对EF Core性能的影响,我们可以编写测试代码来比较预热与不预热的情况下的查询执行时间。具体步骤如下:

  1. 创建一个简单的测试应用程序,包含一个使用EF Core的查询操作。
  2. 在应用程序的入口点处,分别添加预热操作和不预热操作的代码。
  3. 编写测试方法,分别对应预热和不预热的情况。在每个测试方法中,创建一个新的DbContext实例,并执行相同的查询操作。
  4. 使用Stopwatch类来测量每个测试方法的执行时间,并比较两者之间的差异。

通过以上步骤,我们可以得出预热与不预热的情况下查询执行时间的对比结果,从而判断预热操作对EF Core性能的影响。

示例代码

1、初始化数据库,写入10万条数据

using System;
using Microsoft.EntityFrameworkCore;

namespace EFCoreWarmup
{
    // 定义实体类
    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    // 定义数据库上下文
    public class AppDbContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string connectionString = "Data Source=mydb.db";
            optionsBuilder.UseSqlite(connectionString);
        }

        public DbSet<User> Users { get; set; }
    }

    class Program
    {
        // 初始化并添加10万条记录
	    static void InitializeAndAddRecords(AppDbContext context)
	    {
	        const int recordsToAdd = 100000;
	        for (int i = 1; i <= recordsToAdd; i++)
	        {
	            context.Users.Add(new User { Name = #34;User_{i}" });
	            
	            // 每1000条保存一次以提高效率
	            if (i % 1000 == 0)
	            {
	                context.SaveChanges();
	                context.Dispose();
	                context = new AppDbContext(); // 重新创建上下文以确保内存管理
	            }
                Console.WriteLine(i);
	        }
	    }

        static void Main(string[] args)
        {
           using(var db = new AppDbContext())
           {
             db.Database.EnsureCreated();
             InitializeAndAddRecords(db); 
           }
        }
    }
}

2、预热前的执行查询

				/// <summary>
        /// 测试预热前执行查询
        /// </summary>
        static void TestEfCoreWithoutWarmup()
        {
            var stopwatch = Stopwatch.StartNew();
            using (var context = new AppDbContext())
            {
                var users = context.Users.ToList().Take(100);
            }
            stopwatch.Stop();
            Console.WriteLine(#34;预热前执行时间: {stopwatch.ElapsedMilliseconds} ms");
        }
        static void Main(string[] args)
        {
           TestEfCoreWithoutWarmup();
        }

运行结果

3、预热后的执行查询

				/// <summary>
        /// 测试预热后执行查询
        /// </summary>
        static void TestEfCoreWithWarmup()
        {
            var stopwatch = Stopwatch.StartNew();
            using (var context = new AppDbContext())
            {
                var users = context.Users.ToList();
            }
            stopwatch.Stop();
            Console.WriteLine(#34;预热后执行时间: {stopwatch.ElapsedMilliseconds} ms");
        }
        static void Main(string[] args)
        {
            // 执行预热
            using (var context = new AppDbContext())
            {
                context.Database.EnsureCreated();
            }
            TestEfCoreWithWarmup();
        }

运行结果

运行结果对比

预热前后的对比,有接近1.2s的差距。由此可见预热的情况,在一定程度上提高了首次执行的效率。

EF Core 预热处理的优化技巧

提前执行一些查询操作,以便 EF Core 可以缓存查询计划、连接到数据库并建立连接池等资源,下面是一些 EF Core 预热处理的优化技巧:

  1. 在应用程序启动时进行预热处理:在应用程序启动时,执行一些常见的查询操作,以便 EF Core 可以缓存查询计划并建立数据库连接池。这样,在后续的请求中,EF Core 就可以直接使用已经建立好的连接和查询计划,提高性能和响应速度。
  2. 使用后台任务进行预热处理:可以将预热处理操作放在一个后台任务中,以避免应用程序启动时的阻塞。例如,可以使用 .NET Core 中的 Hosted Service 或者定时任务库(如 Hangfire)来执行预热处理。
  3. 选择适当的查询进行预热处理:根据应用程序的需求,选择一些常用的查询进行预热处理。这些查询通常是应用程序中频繁执行的查询,可以帮助 EF Core 建立查询计划并缓存结果,从而提高性能。
  4. 注意预热处理的时机和频率:预热处理不应该过于频繁,否则可能会对数据库造成额外的负担。根据应用程序的特点和数据库的性能,选择适当的时机和频率进行预热处理。
  5. 监控和调整预热处理的效果:在进行预热处理后,监控应用程序的性能和响应速度变化。如果发现预热处理没有达到预期的效果,可以考虑调整预热处理的查询内容或者时机。

总结

EF Core的预热问题是由于模型构建、元数据加载、数据库连接建立和查询计划生成等操作导致的。为了提高应用程序的性能,我们可以采取上述解决方案来优化EF Core的预热问题。通过显式调用EnsureCreated方法、执行迁移操作和预热连接池,我们可以减少首次查询的耗时,并提升应用程序的性能。

希望本文对你理解和解决EF Core的预热问题有所帮助!

参考文档:

#文章首发挑战赛#

#跨年幸运签#

#致敬每个2023的奋斗者#

#挑战30天在头条写日记#

#自律学习计划#

相关推荐

2025南通中考作文解读之四:结构框架

文题《继续走,迈向远方》结构框架:清晰叙事,层层递进示例结构:1.开头(点题):用环境描写或比喻引出“走”与“远方”,如“人生如一条长路,每一次驻足后,都需要继续走,才能看见更美的风景”。2.中间...

高中数学的知识框架(高中数学知识框架图第三章)

高中数学的知识框架可以划分为多个核心板块,每个板块包含具体的知识点与内容,以下为详细的知识框架结构:基础知识1.集合与逻辑用语:涵盖集合的概念、表示方式、性质、运算,以及命题、四种命题关系、充分条件...

决定人生的六大框架(决定人生的要素)

45岁的自己混到今天,其实是失败的,要是早点意识到影响人生的六大框架,也不至于今天的模样啊!排第一的是环境,不是有句话叫人是环境的产物,身边的环境包括身边的人和事,这些都会对一个人产生深远的影响。其次...

2023年想考过一级造价师土建计量,看这30个知识点(三)

第二章工程构造考点一:工业建筑分类[考频分析]★★★1.按厂房层数分:(1)单层厂房;(2)多层厂房;(3)混合层数厂房。2.按工业建筑用途分:(1)生产厂房;(2)生产辅助厂房;(3)动力用厂房;(...

一级建造师习题集-建筑工程实务(第一章-第二节-2)

建筑工程管理与实务题库(章节练习)第一章建筑工程技术第二节结构设计与构造二、结构设计1.常见建筑结构体系中,适用建筑高度最小的是()。A.框架结构体系B.剪力墙结构体系C.框架-剪力墙结构体系D...

冷眼读书丨多塔斜拉桥,这么美又这么牛

”重大交通基础设施的建设是国民经济和社会发展的先导,是交通运输行业新技术集中应用与创新的综合体现。多塔斜拉桥因跨越能力强、地形适应性强、造型优美等特点,备受桥梁设计者的青睐,在未来跨越海峡工程中将得...

2021一级造价师土建计量知识点:民用建筑分类

2021造价考试备考开始了,学霸君为大家整理了一级造价师备考所用的知识点,希望对大家的备考道路上有所帮助。  民用建筑分类  一、按层数和高度分  1.住宅建筑按层数分类:1~3层为低层住宅,4~6层...

6个建筑结构常见类型,你都知道吗?

建筑结构是建筑物中支承荷载(作用)起骨架作用的体系。结构是由构件组成的。构件有拉(压)杆、梁、板、柱、拱、壳、薄膜、索、基础等。常见的建筑结构类型有6种:砖混结构、砖木结构、框架结构、钢筋混凝土结构、...

框架结构设计经验总结(框架结构设计应注意哪些问题)

1.结构设计说明主要是设计依据,抗震等级,人防等级,地基情况及承载力,防潮抗渗做法,活荷载值,材料等级,施工中的注意事项,选用详图,通用详图或节点,以及在施工图中未画出而通过说明来表达的信息。2.各...

浅谈混凝土框架结构设计(混凝土框架结构设计主要内容)

浅谈混凝土框架结构设计 摘要:结构设计是个系统的全面的工作,需要扎实的理论知识功底,灵活创新的思维和严肃认真负责的工作态度。钢筋混凝土框架结构虽然相对简单,但设计中仍有很多需要注意的问题。本文针...

2022一级建造师《建筑实务》1A412020 结构设计 精细考点整理

历年真题分布统计1A412021常用建筑结构体系和应用一、混合结构体系【2012-3】指楼盖和屋盖采用钢筋混凝土或钢木结构,而墙和柱采用砌体结构建造的房屋,大多用在住宅、办公楼、教学楼建筑中。优点:...

破土动工!这个故宫“分院”科技含量有点儿高

故宫“分院”设计图。受访者供图近日,位于北京海淀区西北旺镇的故宫北院区项目已开始破土动工,该项目也被称作故宫“分院”,筹备近十年之久。据悉,故宫本院每年展览文物的数量不到1万件,但是“分院”建成后,预...

装配式结构体系介绍(上)(装配式结构如何设计)

PC构件深化、构件之间连接节点做法等与相应装配式结构体系密切相关。本节列举目前常见的几种装配式结构体系:装配整体式混凝土剪力墙结构体系、装配整体式混凝土框架结构体系、装配整体式混凝土空腔结构体系(S...

这些不是双向抗侧结构体系(这些不是双向抗侧结构体系的特点)

双向抗侧土木吧规范对双向抗恻力结构有何规定?为何不应采用单向有墙的结构?双向抗侧土木吧1.规范对双向抗侧力结构体系的要求抗侧力体系是指抵抗水平地震作用及风荷载的结构体系。对于结构体系的布置,规范针对...

2022一级建造师《建筑实务》1A412020 结构设计 精细化考点整理

1A412021常用建筑结构体系和应用一、混合结构体系【2012-3】指楼盖和屋盖采用钢筋混凝土或钢木结构,而墙和柱采用砌体结构建造的房屋,大多用在住宅、办公楼、教学楼建筑中。优点:抗压强度高,造价...

取消回复欢迎 发表评论: