2011-08-05 3 views
0

シングルトンリモートオブジェクトMBROで次のコードを使用しています。この関数はサーバー側でのみ呼び出されます。リモートキャッシュオブジェクト

''' <summary> 
''' Return a cached DataCentricObject 
''' </summary> 
''' <created_by>CodingBarfield</created_by> 
''' <date>04-08-2011</date> 
Function DataCentricObjectName(ByVal intID As Integer) As String 
    Try 
     SyncLock dictDataCentricObject 
      If Not dictDataCentricObject.ContainsKey(intID) Then 
       Dim st As struct = dcLoader.LoadRecord(intID) 
       dictDataCentricObject(intID) = st.Descript 
      End If 

      Return dictDataCentricObject(intID) 
     End SyncLock 

    Catch ex As Exception 
     Throw New Exception("Error in GetTargName", ex) 
    End Try 
End Function 


Private dictDataCentricObject As New Dictionary(Of Integer, String) 
Dim dcLoader As New DataCentricObject 

LoadRecord機能は、単に少しデータ構造にデータベーステーブルとコピーフィールドからラインを読み出します。

質問

  • (リモート環境での)安全なマルチスレッド、このコードされた別のコードのいずれかのパフォーマンス上の利点は、それがdcLoader.LoadRecordが何をするかに依存し

答えて

1

あります。私は、ちょうどいくつかのデータを読み込んで状態を更新していないと思います。私はまた、dictDataCentricObjectの他のアクセサがそのオブジェクトにロックされていると仮定しています。これが本当であれば、私はこのコードがスレッドセーフであると考えています。

dcLoader.LoadRecordが安価だった場合、ロックの前に並行性を向上させることができます。しかし、私はそれが全体的なパフォーマンスのためにはどこにいても良いかもしれないので、データベースへの呼び出しにつながると思われます。これは、関数呼び出しがより高価なリソースにアクセスする際に連載されることを意味します。これが原因でパフォーマンス上の問題が発生した場合にのみ、dcLoader.LoadRecordのキャッシュを実装できます。