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

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

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

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

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

每个会话的会话是不是更好的模式? 它具有两方面的优点

  1. 缓存永远不会增长。
  2. 实际上可以使用缓存…

那么…… 为什么每个请求的会话被如此广泛地使用,并且每个会话的会话不是?


澄清:

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

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

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

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

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

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

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

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