2017-02-02 65 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有幫助。此外,如果您搜索單個上下文每請求,您會發現很多文章。

相關問題