会话每请求模式(Session Per Request Pattern)是如何工作的?

7
我们正在使用ASP.NET MVC4进行项目开发。在团队会议中,提出了使用“每个请求一个Session”模式的想法。
我进行了一些搜索,并在这里找到了一些问题,通常说,这种模式适用于ORM框架。
以下是一个小例子:
//GET Controller/Test

public ActionResult Test()
{
     //open database connection

     var model = new TestViewModel 
                 {
                      Clients = _clientService.GetClients(),
                      Products = _productService.GetProducts()
                 };

     //close database connection
     return View(model);
}

没有每个请求的会话:

//GET Controller/Test

public ActionResult Test()
{
     var model = new TestViewModel 
                 {
                      Clients = _clientService.GetClients(), // Open and close database connection
                      Products = _productService.GetProducts() // Open and close database connection.
                 };
     return View(model);
}

疑问

  1. 为了解释背景,会话每请求(session per request)是如何工作的?
  2. 它是一个好的解决方案吗?
  3. 最佳实现方式是什么?在 web 上打开连接?
  4. 在涉及复杂查询 / 操作的项目中推荐使用吗?
  5. 当涉及事务时是否可能出现并发问题?

每个请求的会话是在哪个级别上?是客户端到Web服务器,Web服务器到应用服务器还是应用服务器到数据库/数据库服务器?我们需要更多信息才能给出建议。 - DDan
网页应用程序到数据库。 - Marllon Nasser
如果你对每种情况下执行的数据库进行跟踪,你就会看到差异。 - gpersell
2个回答

7

3
在 web(Web 应用程序、WCF、ASP.NET Web API)中,每个请求使用一个 DB 上下文是一个好主意。为什么呢?因为请求的生命周期很短,至少这是你的应用程序的想法,否则你的应用程序将响应时间缓慢,所以创建许多 db 上下文没有意义。
例如,如果您正在使用 EF 作为 ORM 并发出对 Find 方法的请求,EF 将首先在 db 上下文的本地缓存中搜索您要求的任何内容。如果找到了,它将简单地返回它。如果没有找到,它将去数据库中取出并将其保留在缓存中。在您的 Web 应用程序满足请求之前多次查询相同的项目的情况下,这可能非常有益。如果创建上下文,查询某些内容,然后关闭上下文,则可能会进行多次到达数据库的旅程,这可以避免。
进一步阐述,想象您创建了许多新记录:客户记录、订单记录,然后做一些工作,然后根据任何标准为客户创建一些折扣记录,然后创建其他记录,然后创建一些订单项记录。如果您使用每个请求使用单个上下文方法,可以不断添加它们,并在最后调用SaveChanges。EF 将在一个事务中完成此操作:要么全部成功,要么全部回滚。这很棒,因为您即使没有创建事务也可以获得事务行为。如果不使用每个请求使用单个上下文方法,则需要自己处理此类事情。这并不意味着在单个方法中,所有内容都需要在一个事务中:您可以在同一 HTTP 请求中调用SaveChanges多次。考虑其他可能性,例如您提取了一个记录,然后决定编辑该记录,然后再次编辑它:同样,在单个方法中,所有更改将应用于同一对象,然后在一次提交中保存。
除了以上内容之外,如果您仍想阅读更多内容,那么您可能会发现这篇文章有所帮助。此外,如果您搜索每个请求使用单个上下文,您将找到许多文章。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接