首先,一些背景。我們最近接受了一個大型的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;
}
}
`
帕特
您能否展示一些代碼來說明線程問題和解決方案的瓶頸?除此之外,我不喜歡以這種方式使用靜態類,只是這不是問題。也許你可以顯示什麼形式的存儲庫的狀態(靜態)(可能是數據庫連接?Datacontext?) – ivowiblo
該代碼塊似乎顯示了嘗試實現單例模式來創建每個線程實例,而不是一個真正的靜態目的。我不確定這是否是單身人士的最佳方法,因爲沒有做任何事情來鎖定任何東西;如果由於同步問題而在同一個線程上創建兩個演示實體實例,它會「不好」嗎?另外,爲什麼每個線程都有一個? –