1

可以启用在请求开始时开始并在请求结束时结束的缓存??

对于某些表,启用一次不会多次选择同一记录的缓存将很有用。

例如,当我渲染一个部分时,部分内的 SELECT 是不必要的。

假设这个片段:

@foreach(var row in orders)
    {
        @{Html.RenderPartial("Order");}
    }

部分订单是:

<div>
        @session.Query<Langs>.SingleOrDefault(el => el.Id == "EN').Description
    </div>
<div>
    @Model.OrderID
</div>

是否可以启用仅在当前会话中缓存“Langs”表的缓存?

如果没有缓存,我每个请求都有 N(订单计数)SELECT,否则使用请求缓存我每个请求会有 1 个 SELECT。

谢谢你!

4

2 回答 2

2

您不应该从任何视图(例如您提到的部分视图)中执行任何数据库查询。这几乎总是会导致 SELECT N+1 场景。

遵循 MVC 模式,不要混淆关注点。任何数据库查询都应从存储库层启动,然后填充表示视图需要哪些数据的模型对象,然后将该模型传递给视图。

通过编程,一切皆有可能,并且总是有上百万种方法可以做同样的事情,但遵循最佳实践和关注点分离将使您远离自己,并帮助您构建高效、可扩展和可维护的应用程序。

To reiterate, whatever data your view needs access to, do all of that querying on the Controller-side of the MVC pattern. Doing it any other way is mixing concerns and leads to situations such as the one you are encountering.

于 2012-08-03T07:52:31.410 回答
1

您至少有 2 个可能性:

  • 缓存您的查询
  • 在对象 Langs 映射上启用缓存

询问:

 @session.Query<Langs>.SetCacheable(true).SingleOrDefault(el => el.Id == "EN').Description

并将键 hibernate.cache.use_query_cache = true 添加到配置中

于 2012-08-02T12:57:27.047 回答