2009-02-27 65 views
1

我們每晚都會在與應用程序數據庫位於同一個實例中的數據庫中更新數據。所以爲了節省數據庫調用,我想將這個靜態數據緩存到List(Of MyObject)中。從理論的角度來看,這個緩存的List(Of)應該通過全局變量緩存在表示層代碼中嗎?它應該在.DLL中的全局變量中嗎?WinForms應用程序數據緩存 - 要緩存哪個層?

我想在.DLL,因爲我創建了一個服務層,這是公開暴露在圖形用戶界面,使調用到.DLL裏面的數據訪問層:

Public Shared Function Search(ByVal criteria As Core.Other.Customer) As List(Of Core.Other.Customer) 
    ' TODO: Check the customer cache to see if it has been populated yet. If not, populate it. 
    If 1 = 1 Then 
     ' TODO: Variable "list" needs to be a global object in the DLL. 
     ' For SO readers: Dal class declared Friend. 
     Dim list As List(Of Core.Other.Customer) = Dal.Search.Customers.GetCache() 
    End If 

    Dim results As New List(Of Core.Other.Customer) 
    ' TODO: Find the relevant customers in the cache and add them to variable "results". 
    Return results 
End Function 

我要去關於這個我能做到的最好的方式?

回答

3

我會傾向於緩存這在你的服務層。我喜歡保持數據訪問簡單(通常使用像NHibernate這樣的OR/M),所以我不想在那裏做任何可能會改變我對數據訪問層工作原理的期望(作爲開發人員,我期望所有人調用DAL實際上擊中數據庫,而不是緩存,除非它是OR'M的緩存,並且這是我不關心的實現細節)。

該服務看起來像是適當的地方(當我緩存數據,這是我在我的應用程序中,如果有幫助的話)。

0

您可能會考慮在沒有緩存的情況下執行此操作,並查看是否存在性能/網絡問題。這可能是過早的優化?

+1

一些用戶將通過VPN使用該應用程序,這可悲的是在公司中低於標準。需要2秒鐘的數據庫調用在VPN上需要10秒。我需要在腦海中進行一些優化。 – HardCode 2009-02-27 17:08:12

2

您的List(Of x)是否需要進行任何處理,或者它只是從數據庫中提取的原始數據?

如果只是從數據庫中提取原始數據,那麼將其緩存在數據訪問層可能是一個好主意。

但如果需要處理,那麼就應該在業務邏輯層

既然你指的是表象的代碼和.dll做,做你碰巧是指一個n-tier architecture

+0

這些數據只是原始的,未處理的數據 - 客戶列表,他們的地址,他們的ID等。 是的,它是n層。 – HardCode 2009-02-27 17:07:09