繁体   English   中英

实体框架-解决延迟加载的性能问题的最佳实践

[英]Entity Framework - Best practice to resolve performance issue with lazy loading

我已经用Entity Framework接管了一个项目。 该代码似乎具有良好的层次结构,并且结构良好。 问题是,正如我在Entity Framework中看到的很多次一样, 他们大量使用了延迟加载。 直到数据库获得一些数据并且sql查询达到峰值后,问题才出现。

该解决方案充分利用了使存储库较小并仅获取一个数据级别的优点,并且当我处理一些最大的性能问题时,最常见的问题通常是通过向存储库添加特定功能来解决,以加载嵌套实体和使用一些动态查询。

即GetCustomerWithOrderData,其中包括订单,订单行等。

有时我必须先合并两个查询,首先获取Customer(包含关系),然后获取Orders(包含关系),并通过linq将它们映射在一起。

查询要比示例复杂得多,并且延迟加载可能在业务层,控制器或视图中,因此有很多需要跟踪解决的问题。

但是我觉得代码很大,很难找到未来的问题。 我现在需要的是一种跟踪何时有延迟加载的好方法,并且还能够告诉您在特定调用中需要加载哪些对象。

最好的办法是,如果我可以跟踪特定的操作调用,并获取执行的SQL,执行多少次,加载时间等。

该解决方案是使用MVC 3和EF4构建的,通过升级到较新的EF是否可以获得任何性能?

在上一份工作中,这成为一个问题,因为开发人员会滥用该框架并在整个地方创建n+1问题-仅在表变大时才表现出来。 另外,如果您未指定序列化深度停止为1,那么延迟加载也会对json序列化造成问题,即使这很奇怪,有时相关对象也会在那里,而其他时候却不会(取决于深度)。

最后,我们完全关闭了延迟加载,并迫使开发人员进行第二次数据库调用以获取所需的子实体。 此外,还指示该团队在开发时不要打开Sql Server Profiler ,以确保不会破坏性能。

这种方法也肯定有弊端,例如额外的数据库往返,额外的代码行以及新开发人员到团队普遍缺乏理解的理由。 有人认为我们可以在查询中使用Includes,但是在某些时候,这样做会使我们的存储库变得肿,简单性/可读性也很重要。 最后,性能问题不复存在,因此我认为消除延迟加载的权衡是值得的。

您问,这不是问题的直接答案,但也许会给您一些更多的见解。 在您的情况下,我会看着Profiler查看发生最严重滥用的位置,然后一次对其进行修复,直到您的性能再次被接受。 您可能会发现您的解决方法是做类似的事情,并完全消除延迟加载。

我希望看到该问题的其他答案,因为我认为这是一个重要的话题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM