2011-08-05 5 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 함수는 데이터베이스 테이블에서 행을 읽고 필드를 작은 데이터 구조로 복사합니다.

질문

  • 의 (a 원격 환경에서) 안전 멀티 스레딩이 코드
  • 그것은 dcLoader.LoadRecord가하는 일에 따라 다른 코드

답변

1

에 대한 성능 이점이 있습니까입니다. 나는 이것이 단지 일부 데이터를 읽고 어떤 상태도 업데이트하지 않는다고 추측 할 것이고, 나는 또한 dictDataCentricObject의 다른 접근자가 그 객체를 잠그고 있다고 가정하고있다. 이것이 사실이라면이 코드는 스레드로부터 안전하다고 생각합니다.

dcLoader.LoadRecord이 저렴하면 동시성을 향상시키기 위해 잠금 전에 수행 할 수 있습니다. 그러나, 나는 그것이 데이터베이스에 대한 호출을 초래할 것이라고 생각한다. 그래서 전반적인 성능을 위해 그것이있는 곳을 유지하는 것이 더 나을 것이다. 이는 함수에 대한 호출이보다 비싼 리소스에 대한 액세스에서 직렬화됨을 의미합니다. 이로 인해 성능 문제가 발생하는 경우에만 dcLoader.LoadRecord 주위에 캐싱을 구현할 수 있습니다.

관련 문제