Удаленный кеш-объект - PullRequest
       37

Удаленный кеш-объект

0 голосов
/ 05 августа 2011

Я использую следующий код в объекте удаленного взаимодействия 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 Ответ

1 голос
/ 05 августа 2011

Это зависит от того, что делает dcLoader.LoadRecord.Я собираюсь предположить, что это просто читает некоторые данные и не обновляет никакого состояния, я также предполагаю, что другие обработчики dictDataCentricObject блокируют этот объект.Если это так, то я думаю, что этот код является поточно-ориентированным.

Если бы dcLoader.LoadRecord был недорогим, вы могли бы сделать это до блокировки, чтобы улучшить параллелизм.Тем не менее, я подозреваю, что это приводит к обращению к базе данных, поэтому для общей производительности может быть лучше остаться на месте.Это означает, что вызовы функции будут сериализованы при доступе к более дорогому ресурсу.Если и только если это вызывает у вас проблемы с производительностью, вы можете реализовать некоторое кэширование около dcLoader.LoadRecord.

...