2017-02-02 25 views
4

我们正在使用ASP.NET MVC4开展一个项目。在团队的其中一次会议中,提出了使用会话每个请求 模式的想法。它如何工作Session Per Request模式?

我做了一个小小的搜索,发现了一些问题,在这里说 - 总的来说 - 这种模式(如果可能被称为)它表示框架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. 要进行背景化,每个请求的会话如何工作?
  2. 这是一个很好的解决方案吗?
  3. 实施它的最佳方式是什么?在网络上打开连接?
  4. 是否在具有复杂查询/操作的项目中推荐?
  5. 当涉及到交易时,是否有可能发生并发问题?
+0

每个请求的会话在哪个级别完全相同? Web服务器,Web服务器到应用服务器还是应用服务器到数据库/数据库服务器,它是客户端吗? 我们需要更多信息才能提供建议。 – DDan

+0

Web应用程序到数据库。 –

+0

如果您在每种情况下都对数据库执行的操作进行跟踪,您将看到不同之处。 – gpersell

回答

1

在Web(Web应用程序,wcf,asp.net web api)中,每个请求使用一个数据库上下文是一个好主意。为什么?由于请求是短暂的,至少这是想法或者你的应用程序的响应时间很慢,所以创建许多数据库上下文没有意义。

例如,如果您使用EF作为ORM并向Find方法发出请求,则EF将首先搜索您在本地数据库上下文缓存中询问的任何内容。如果找到它,它将简单地返回它。如果找不到 ,它将转到数据库并将其拉出并保存在缓存中。在您的Web应用程序完成请求之前,您可以多次查询相同的项目,这可能会非常有用。如果你创建一个上下文,查询一些东西,关闭上下文,那么你就有可能多次访问可以避免的数据库。要进一步详细说明,假设您创建了许多新记录:客户记录,订单记录,然后执行一些工作,然后根据任何标准为客户创建一些折扣记录,然后创建一些其他记录,然后再创建一些记录orderitem记录。如果您使用Single Context Per-Request方法,您可以继续添加它们并在末尾呼叫SaveChanges。英孚将在一次交易中完成此项任务:要么全部成功,要么全部回滚。这非常棒,因为您无需创建事务即可获得事务性行为。如果你没有采取Single Context Per-Request的方法,那么你需要自己照顾这些事情。这并不意味着在Single方法中,所有事情都需要在一个事务中进行:您可以在同一个http请求中多次调用SaveChanges。考虑其他可能性,你在哪里拉记录,然后决定编辑记录,然后再编辑一遍:再次在Single方法中,它将全部应用于相同的对象,然后一次保存。

除了上述内容,如果您还想阅读更多内容,那么您可能会发现this有帮助。此外,如果您搜索单个上下文每请求,您会发现很多文章。

相关问题