【问题标题】:How to: one database call per request in ASP.NET MVC using L2S如何:使用 L2S 在 ASP.NET MVC 中的每个请求一个数据库调用
【发布时间】:2011-04-15 06:12:27
【问题描述】:

如何在一次调用 DB 中获取处理请求所需的所有数据。另外我想知道如果我的母版页还需要数据库中的一些数据,我将如何做到这一点?我知道它在Passing data to Master Page in ASP.NET MVC 中得到了澄清。但我认为这将对数据库进行多次调用。如果不是这样,请告诉我。

更新
+1 并感谢所有回答者/评论者的意见和建议。

【问题讨论】:

  • 请求关闭原因...
  • “很难说出这里要问什么。这个问题是模棱两可、含糊不清、不完整、过于宽泛或修辞的,无法以目前的形式得到合理的回答。”

标签: asp.net-mvc nhibernate linq-to-sql entity-framework asp.net-mvc-3


【解决方案1】:

我认为您可能会混淆 one session per requestSELECT N + 1 场景。对数据库进行多次调用是非常好的,但是您要注意何时必须对列表中的每个项目进行一次数据库调用。这在使用延迟加载列表时最常遇到。解决方案是使用 Eager fetching。

ps。我认为获取数据到母版页的流行解决方案是在母版页中使用Html.RenderAction。这样您就不必担心整个地方的母版页问题(如导航)。

【讨论】:

  • 第一件事。我不知道one session per requestSELECT N +1 是什么,所以我不会混淆它们。但我想知道这些是什么。你能详细说明一下吗?你说It is perfectly fine to have multiple calls to the database (for a single request)。是吗?我不知道。如果是这样,那么提出这个问题就没有意义了。
  • 每个请求多次调用数据库是完全可以的。您是否认为这个 Stack Overflow 问题及其所有答案、cmets、用户数据、标签、职业信息、统计数据都在对数据库的一次调用中检索到?
【解决方案2】:

我必须同意其他答案,你的理由是什么?

NHibernate 可以使用FUTURES 批处理 SQL 语句,你读过这个blog post吗?

但是,我不确定您将如何结合所有可能性,以获取您网站上的所有视图。如果您确实提出了解决方案,我很乐意看到它。

这并不容易,不可能展示一个小代码示例。

【讨论】:

    【解决方案3】:

    将自己限制为每个请求仅命中一个数据库有点难度。你这样做的原因是什么?这只是你给自己设定的一个有趣的挑战吗?如果是出于优化的原因,有更好的方法来实现这一点:优化查询、缓存等。

    【讨论】:

    • 显然仅用于优化。缓存没有用,因为所需的数据会有很大差异。查询肯定也必须优化。没关系。即使做了这两件事,你不认为限制数据库调用会进一步优化性能吗?考虑到我为母版页进行了一次 DB 调用,为请求特定信息进行了另一次调用,如果我在我的网站上获得 x 次点击,那么它将对 DB 进行 2 倍的调用。如果我的用户群在一年内翻了一番或几倍,它会将数据库调用增加到一年前请求数量的 4 倍。这不应该是令人担忧的吗?
    • 事情没那么简单。一次调用数据库并不像两次调用那样昂贵。连接池将抵消打开/关闭连接的大部分成本,因此成本在于网络流量,解析和执行查询,然后解析结果集。两个小查询还是一个大的多结果集查询哪个更便宜?然后您还需要考虑执行计划,因为它们不太可能被合并查询重用(因为您合并的查询越多,出现变化的机会就越大)。很少有这么简单。
    • 虽然努力减少数据库查询的数量是一个崇高的目标,但将它们减少到只有一个可能会以某种方式限制您的应用程序。 “让一切尽可能简单,但不要更简单”——爱因斯坦
    • 谢谢@James,你听起来很棒。你试图回答我心中更大的问题。我认为您可以发布作为答案。也非常感谢@Sunday。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2010-11-30
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多