“每个请求的会话”模式是否利用了缓存? (“每个会话的会话”或“每个请求的会话”)

时间:2012-09-23 16:51:35

标签: c# .net entity-framework nhibernate orm

我今天在Web应用程序中从头开始构建一个新的应用程序 (技术是Asp.Net,我使用的ORM是Entity Framework。如果重要的话)

我不确定广泛使用的模式 会话每个请求 是否真的很好。
正如我所看到的,该模式的优点是缓存不会增加,直到数据库会话崩溃\太大而且效率低下。

但是,每个请求的新会话是不是太多了?这意味着每个服务器调用都会重置缓存,即使像auto-complete这样的简单ajax请求也有一个全新的缓存,实际上对于缓存重置的每个键击都是如此。

您在一个请求中查询同一对象实体行的可能性很小。

不是 每个会话的会话 是一个更好的模式吗?它有两个优点意义

  1. 缓存永远不会增长。
  2. 实际上可以使用缓存......
  3. 所以... 为什么每个请求的会话如此广泛使用,每个会话的会话不是?


    澄清:

    1. 当我编写ORM会话时,它同时适用于NHibernate's sessionEntityFramework's DbContext
    2. 我的意思是在每个请求上对session \ dbcontext进行flush-commit-SaveChanges。

2 个答案:

答案 0 :(得分:1)

每个请求模式的会话对于与ORM一起使用更自然,更健壮。它获得脏实体的机会较小,并且具有更可预测的资源管理。

如果我说得对,你的意思是Session下的DbContext实例比会话每会话只能在没有数据修改的应用程序中使用,否则你会得到意外的数据提交,而其他请求执行数据修改。此外,我不确定实体框架上下文是否是线程安全的 - 处理请求是多线程的。

我不完全确定,但我认为Entity Framework不会像您期望的那样使用缓存(==身份映射)。在选择实体集时,即使所有数据都在缓存中,它也会查询数据库 - 它只能避免构建新实体,而是使用身份图中的现有实体。

对于缓存,还有其他解决方案,它们更好。

答案 1 :(得分:1)

对我来说,一切都是通过将工作单元限制为单个请求来提供一致性。我不确定当出现问题时每个会话的会话是如何工作的。

例如,如果处理了多个请求,然后在提交时遇到乐观并发异常,您会怎么做?那时你可能会遇到几次合并冲突。

因此,每个请求的会话只会限制您的冲突风险,并在请求范围内完成工作单元。