2009-02-27 7 views
1

私は、アプリケーションのデータベースと同じインスタンスに存在するデータベースで夜間に更新されるデータを持っています。したがって、データベース呼び出しを節約するために、この静的な一日のデータをList(Of MyObject)にキャッシュします。理論的には、キャッシュされたList(Of)はプレゼンテーション層のコードにグローバル変数を介してキャッシュされるべきですか?それは.DLLのグローバル変数にあるべきですか?WinForms Appのデータキャッシュ - どのレイヤーをキャッシュするのですか?

私はGUIに公開されおよび.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を使って)保つのが好きです。(開発者としては、 OR'Mのキャッシュでない限り、キャッシュではなくDBに実際にアクセスするためのDALへの呼び出し、それは私が気にしない実装の詳細です)。

サービスは適切な場所のように見えます(データをキャッシュすると、それが私のアプリで行います)。

0

パフォーマンス/ネットワークの問題がある場合は、キャッシュせずに確認することを検討してください。これは早すぎる最適化かもしれませんか?

+1

一部のユーザーは、VPN上でアプリケーションを使用しますが、悲しいことに、会社のサブパーです。ここで2秒かかるデータベースコールは、VPNで10秒かかります。私はいくつかの最適化を念頭に置いてこれに入る必要があります。 – HardCode

2

List(Of x)は処理が必要ですか、それともデータベースから取得した生データですか?

データベースから取得した生データのみの場合は、データアクセスレイヤでキャッシュすることをお勧めします。

しかし、それは、処理を必要に応じて、それはあなたがプレゼンテーションコードと.DLLを参照しているので、あなたがn-tier architectureを意味するために起こったビジネスロジック層

で行う必要がありますか?

+0

データは生の未処理のデータです。顧客のリスト、住所、IDなど はい、それはn層です。 – HardCode

関連する問題