gpt4 book ai didi

entity-framework - 是否可以改善 EF6 预热时间?

转载 作者:行者123 更新时间:2023-12-04 08:29:44 34 4
gpt4 key购买 nike

我有一个应用程序,我在其中验证了以下行为:长时间不活动后的第一个请求需要很长时间,有时会超时。是否可以控制 Entity Framework 如何管理对象的处置?是否有可能将某些实体标记为永远不会被处置?...为了避免/改善预热时间?

问候,

最佳答案

类似查询的响应时间会缩短的原因是多方面的。

  • 大多数数据库管理系统都会缓存部分提取的数据,以便在不久的将来进行类似的查询会更快。如果您查询Teachers with their Students,则Teachers 表将与Students 表连接。此连接结果通常会缓存一段时间。 Teachers with their Students 的下一个查询将重用此连接结果,从而变得更快
  • DbContext 缓存查询对象。如果您选择一个Single 老师,或Find 一个,它会保存在本地内存中。这是为了能够在您调用 SaveChanges 时检测到更改了哪些项目。如果您再次Find 相同的Teacher,这个查询会更快。如果您查询 1000 个 Teachers,我不确定是否会发生同样的情况。
  • 当您创建 DbContext 对象时,会检查初始化程序以查看模型是否已更改。

因此,不 Dispose() 创建的 DbContext 似乎是明智的,但您会看到大多数人保持 DbContext 存活一段时间相当短的时间:

using (var dbContext = new MyDbContext(...))
{
var fetchedTeacher = dbContext.Teachers
.Where(teacher => teacher.Id = ...)
.Select(teacher => new
{
Id = teacher.Id,
Name = teacher.Name,
Students = teacher.Students.ToList(),
})
.FirstOrDefault();
return fetchedTeacher;
}
// DbContext is Disposed()

乍一看,让 DbContext 保持事件状态似乎更好。如果有人请求相同的 TeacherDbContext 就不必向数据库请求它,它可以返回本地 Teacher..

但是,让 DbContext 保持事件状态可能会导致您获得错误的数据。如果其他人在您对该 Teacher 的第一次和第二次查询之间更改了 Teacher,您将获得旧的 Teacher 数据。

因此,明智的做法是让 DbContext 的生命周期尽可能短。

有什么办法可以提高第一次查询的速度吗?

是的,你可以!

您可以做的第一件事就是设置数据库的初始化,这样它就不会检查数据库的存在和模型。当然,只有当您相当确定您的数据库存在并且没有更改时,您才能这样做。

// constructor; disables initializer
public SchoolDBContext() : base(...)
{
//Disable initializer
Database.SetInitializer<SchoolDBContext>(null);
}

另一件事可能是,如果你已经获取了你的对象来更新数据库,并且你确定没有其他人更改了该对象,你可以附加它,而不是再次获取它, as is shown in this question

正常使用:

// update the name of the teacher with teacherId
void ChangeTeacherName(int teacherId, string name)
{
using (var dbContext = new SchoolContext(...))
{
// fetch the teacher, change the name and save
Teacher fetchedTeacher = dbContext.Teachers.Find(teacherId);
fetchedTeader.Name = name;
dbContext.SaveChanges();
}
}

使用 Attach 更新之前获取的 Teacher:

void ChangeTeacherName (Teacher teacher, string name)
{
using (var dbContext = new SchoolContext(...))
{
dbContext.Teachers.Attach(teacher);
dbContext.Entry(teacher).Property(t => t.Name).IsModified = true;
dbContext.SaveChanges();
}
}

使用此方法不需要再次获取教师。在 SaveChanges 期间,检查所有 Attached 项目的所有属性的 IsModified 值。如果需要,它们将被更新。

关于entity-framework - 是否可以改善 EF6 预热时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52587331/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com