2011-08-05 29 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函数只是从数据库表中读取一行并将这些字段复制到一个小数据结构中。

问题

  • 这是多线程的代码安全(在远程环境)
  • 是否有不同的代码

回答

1

这取决于什么dcLoader.LoadRecord做任何性能优势。我会猜测这只是读取一些数据,并没有更新任何状态,我还假设dictDataCentricObject的其他访问者锁定该对象。如果这是真的,那么我认为这个代码是线程安全的。

如果dcLoader.LoadRecord价格低廉,您可以在锁定之前完成以提高并发性。但是,我怀疑它会导致对数据库的调用,因此对于整体性能来说,保留它的位置可能会更好。这确实意味着对该函数的调用将在访问更昂贵的资源时序列化。如果且仅当这会导致您遇到性能问题时,您才可以在dcLoader.LoadRecord左右实施一些缓存。