【问题标题】:How to improve Entity Framework 4.0 large model startup performance?Entity Framework 4.0大模型启动性能如何提升?
【发布时间】:2011-07-19 20:57:31
【问题描述】:

在 EDMX 实体模型中包含大约 350 个实体的项目中,我的团队在第一次查询发生和第一次保存发生时经历了漫长的等待。

在分析运行几个查询并保存的简单案例时,只需几分钟即可触发查询和保存的一组简单步骤。

第一个查询仅调用执行查询的框架方法就占用了总时间的 47%。

第一次保存仅在 System.Data.Objects.ObjectContext.SaveChanges 中占用了总时间的 50%。

有什么好的选择可以提高性能 - 这可能会浪费开发时间。

(一旦系统投入生产,它在启动时很烦人,但在持续执行期间不是问题)

【问题讨论】:

    标签: performance optimization entity-framework-4


    【解决方案1】:

    当您第一次使用上下文时,它会生成元数据中定义的映射模型。选项是pregenerate this model 并在您的应用程序中包含预生成的文件(但您必须在每次修改 EDMX 时重新生成它)。

    这么大的模型大概应该分成多个较小的模型。我几乎不相信 350 个实体会形成一个不可分割的域。

    【讨论】:

    • 谢谢!它运作良好。我最终使用了您引用的文章中链接到的 T4 模板生成方法。它将我的初始查询运行时间减少到原始时间的 5% 以下,并且初始保存时间类似。时间成本转移到了保存 EDMX 上,但由于这是一个不太频繁的操作,因此在调试运行期间可以节省大量的开发时间。 blogs.msdn.com/b/adonet/archive/2008/06/20/…
    • 您关于拆分模型的观点得到理解和赞赏。有趣的是,我们之前有单独的模型,但最终得出的结论是,统一的模型可以缓解单独模型带来的一些挑战,并且对于这个系统,优势超过了其他问题。
    【解决方案2】:

    单个大型 EDMX 将导致大型 ObjectContext。每次您执行using(var ctx = new YourObjectContext()) 时,它都会构造一个大对象,初始化大量集合(可能有 350 个),这将使您的数据库操作占用大量 CPU。当您获得大量流量时,您肯定会遇到性能挑战。

    我建议将大型 WDMX 分解为更小的 EDMX 并生成不同的 ObjectContext。您应该将少量逻辑分组的实体放入一个 ObjectContext。

    【讨论】:

      猜你喜欢
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多