首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >7秒EF启动时间,即使对于微小的DbContext也是如此

7秒EF启动时间,即使对于微小的DbContext也是如此
EN

Stack Overflow用户
提问于 2012-09-24 12:43:58
回答 2查看 3.1K关注 0票数 11

我试图缩短基于EF的应用程序的启动时间,但我发现即使在单个实体上下文中,我也无法将初始读取所需的时间减少到7秒以下。特别奇怪的是,这一次并不是特定的上下文类型。

有人能解释是什么原因造成了这些缓慢的时间和/或我如何使事情跑得更快?

下面是完整的示例代码:

在我的数据库中,有一个名为se_stores的表,其中包含一个主键列AptId:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // a sample entity class
public class Apartment
{
    public int AptId { get; set; }
}

    // two identical DbContexts        

public class MyDbContext1 : DbContext
{
    public MyDbContext1(string connectionString) : base(connectionString)
    {           
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext1>(null);

        var config = new EntityTypeConfiguration<Apartment>();
        config.HasKey(a => a.AptId).ToTable("se_stores");
        modelBuilder.Configurations.Add(config);

        base.OnModelCreating(modelBuilder);
    }
}

public class MyDbContext2 : DbContext
{
    public MyDbContext2(string connectionString)
        : base(connectionString)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext2>(null);

        var config = new EntityTypeConfiguration<Apartment>();
        config.HasKey(a => a.AptId).ToTable("apartments");
        modelBuilder.Configurations.Add(config);

        base.OnModelCreating(modelBuilder);
    }
}

    // finally, I run this code using NUnit:

var start = DateTime.Now;
var apt1 = new MyDbContext1(connectionString).Set<Apartment>().FirstOrDefault();
var t1 = DateTime.Now - start;
start = DateTime.Now;
var apt2 = new MyDbContext2(connectionString).Set<Apartment>().FirstOrDefault();
var t2 = DateTime.Now - start;
Console.WriteLine(t1.TotalSeconds + ", " + t2.TotalSeconds);

它可靠地打印如下所示: 7.5277527,0.060006。当我首先将测试切换到使用MyDbContext2时,我得到了相同的结果(因此,无论哪个DbContext首先被初始化,都会得到相同的结果)。我还尝试使用EF电动工具预生成视图。这使得第一个上下文的时间减少到6.8秒左右,因此只是一个小小的胜利。

我知道DateTime.Now是一种糟糕的分析方法,但在使用dotTrace时,这些结果仍然有效。我还知道,第一次运行一些代码会调用一个JITing成本,但7秒似乎太高了,无法归因于此。

我使用EF 4.3.1和.NET 4与VS 2010。

提前感谢您的帮助!

编辑:有人建议打开SQL连接可能会导致问题。

  1. 我首先尝试使用原始SqlConnection运行随机查询,并使用相同的连接字符串创建命令。这花费了1秒时间,不影响DbContext初始化的时间。
  2. 然后,我尝试使用连接字符串创建一个SqlConnection,并将其传递给接受连接的DbContext构造函数。我通过了contextOwnsConnection=false。这也对DbContext初始化时间没有影响。
  3. 最后,我尝试使用相同的凭据和连接字符串选项通过management进行连接。这几乎是瞬间的。
  4. 在SqlConnectionFactory.CreateConnection(connectionString)配置文件中,它将dotTrace度量为占用0.7秒,这与原始的dotTrace时间一致。

编辑:我想知道延迟是每个连接还是只有一次。因此,我尝试让MyDbContext1和MyDbContext2连接到不同服务器上的完全不同的数据库。不管首先连接到哪个数据库,这都没有什么区别:第一个DbContext的使用花费了大约7秒,而第二个上下文的使用速度非常快。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-25 06:12:29

在将您编写的代码放在自己的项目中之后,我发现项目的平台目标对EF框架的启动时间有很大影响。

当以x64平台为目标时,我收到了类似于您的结果(第一个DbContext上有7秒旋转,第二个DbContext上小于1秒)。当目标为x86时,第一个DbContext的自旋时间将减少约4秒,降至3.34633秒,而第二个DbContext所需的时间与x64情况下的时间相同。

我不知道为什么会发生这种情况,但它必须与实体框架如何在不同的环境中初始化自己有关。我已经发布了一个关于那个here的单独问题。

票数 8
EN

Stack Overflow用户

发布于 2012-09-24 14:36:26

根据一些注释,第二次运行速度这么快的原因是连接管理器缓存连接。这让我相信,获得最初的联系是问题所在。

要尝试的事情:

  1. 更改连接字符串以使用db服务器的IP地址,而不是它的名称。
  2. 使用完全相同的凭据和机制使用连接到数据库服务器。从花了7秒的机器上这样做。假设这需要一段时间,调查一下哪些协议正在使用,并确保您想要的协议是列表中的第一个协议。
  3. 在你的机器上安装一个网络分析器,观察它所做的事情。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12572623

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文