4

首先,一些背景。我們最近接受了一個大型的MVC3項目。該項目已經準備就緒,可以在一段時間前上線,然後客戶決定重新整理主題並添加更多功能。他們僱傭我們重新設計網站主題,完成剩餘的功能並部署它。靜態存儲庫 - 解決方法

一般而言,它是使用非常明確的有序方法構建的,每個數據庫表和清晰的服務層都有一個存儲庫,但有一些古怪讓我感到有些不舒服。我一直在嘮叨的主要原因是應用程序中的每個存儲庫和服務都是完全靜態的(是的,包括寫入數據庫的方法)。當然,這不允許進行單元測試,但更重要的是當應用程序承受沉重負載時可能遇到的瓶頸和線程問題。我已經看到在舞臺服務器上處理請求時出現了一些無法解釋的延遲,這與測試流量涓流有關。

該應用程序非常龐大,重建它以使用IOC /實例化每個請求存儲庫幾乎是不可能的。

我能做些什麼來避免部署時潛在的線程問題?每次寫入需要發生時,我可以使用連接池並借用數據庫連接嗎?

感謝提前:)

編輯 - 這裏是一些創建實體模型的實例代碼。每個靜態方法都會調用這個'DemoEntities'方法來獲取實體模型的實例,然後用它來執行db命令。我可以在這裏看到,儘管該方法是靜態的,但它實際上是檢查HttpRequest是否存在預先存在的實例,如果它尚不存在,則創建一個。因此,我認爲我們會沒事的。

public static DemoEntities DemoEntities 
    { 
     get 
     { 
      if (HttpContext.Current != null && HttpContext.Current.Items["DemoEntities"] == null) 
      { 
       HttpContext.Current.Items["DemoEntities"] = new DemoEntities(); 
      } 
      return HttpContext.Current.Items["DemoEntities"] as DemoEntities; 
     } 
     set 
     { 
      if (HttpContext.Current != null) 
       HttpContext.Current.Items["DemoEntities"] = value; 
     } 
    } 

`

帕特

+0

您能否展示一些代碼來說明線程問題和解決方案的瓶頸?除此之外,我不喜歡以這種方式使用靜態類,只是這不是問題。也許你可以顯示什麼形式的存儲庫的狀態(靜態)(可能是數據庫連接?Datacontext?) – ivowiblo

+0

該代碼塊似乎顯示了嘗試實現單例模式來創建每個線程實例,而不是一個真正的靜態目的。我不確定這是否是單身人士的最佳方法,因爲沒有做任何事情來鎖定任何東西;如果由於同步問題而在同一個線程上創建兩個演示實體實例,它會「不好」嗎?另外,爲什麼每個線程都有一個? –

回答

6

我這裏假設你的倉庫類只包含靜態方法,沒有任何靜態狀態。

無狀態靜態類的好處在於,它們可以安全地轉換成具有默認無參數構造函數的常規類,並且不用擔心它們的壽命。這將是一個簡單的例子來提取一個接口用於測試目的。

無論何時您需要與存儲庫交談,只需實例化一個存儲庫。

除非應用程序在存儲庫使用期間正在使用共享狀態執行某些操作,否則不應該擔心多線程訪問。數據庫本身負責處理許多併發呼叫。

目前所有的瓶頸和線程問題都是潛在的,有時候我們受過教育的猜測是什麼可能出錯是自己錯 - 尤其是多線程。減速可能僅僅是因爲數據庫沒有應付太多請求的咕嚕聲。

+0

感謝您的回答,這聽起來像我們可能會在這種情況下。查看我即將發佈在Filburt評論中的代碼。 –

相關問題