Веб-сервисы Azure Appfabric Caching + WCF - PullRequest
2 голосов
/ 03 июля 2011

У меня есть ряд веб-служб WCF, размещенных в Windows Azure, и я пытаюсь реализовать кэширование appfabric.

Я борюсь с природой веб-служб без сохранения состояния и необходимостью избежать дорогостоящей инициализации базы данных и данных.объекты datacache.

Я завернул свою базу данных в синглтон, так как это казалось хорошим началом ... ..... 1005 *

Imports Microsoft.ApplicationServer.Caching
Public Class Cache

    Private Shared _DataCacheFactory As DataCacheFactory
    Private Shared _DataCache As Microsoft.ApplicationServer.Caching.DataCache

    Private Sub New()

    End Sub


    Shared ReadOnly Property DataCacheFactory As DataCacheFactory
        Get
            If IsNothing(_DataCacheFactory) Then

                Dim localTimeout As New TimeSpan(0, 10, 0)
                Dim localCacheConfig As New DataCacheLocalCacheProperties(10000, localTimeout, DataCacheLocalCacheInvalidationPolicy.TimeoutBased)
                Dim factoryConfig As New DataCacheFactoryConfiguration()



                factoryConfig.LocalCacheProperties = localCacheConfig

                _DataCacheFactory = New DataCacheFactory(factoryConfig)

            End If

            Return _DataCacheFactory

        End Get
    End Property

    Shared ReadOnly Property DataCache As Microsoft.ApplicationServer.Caching.DataCache
        Get
            If IsNothing(_DataCache) Then
                _DataCache = DataCacheFactory.GetDefaultCache
            End If

            Return _DataCache

        End Get
    End Property

End Class

Но когда я пытаюсь его использовать,кажется выходит из области видимости и воссоздается повторно, а не один раз для каждого лазурного экземпляра.Если я правильно понимаю вещи, то это в основном сводится к ..... Где я могу хранить глобальную переменную в веб-сервисе wcf, чтобы она не выходила за рамки.

Ответы [ 3 ]

2 голосов
/ 03 июля 2011

Из того, что я вижу, ваш код должен делать то, что вы хотите, чтобы он делал. Единственное, что я хотел бы предложить (что не имеет никакого отношения к вашей проблеме), - это наложить некоторые ограничения на создание, например. для вашего кратчайшего имущества:

Private Static _DataCacheLock as New Object()

Shared ReadOnly Property DataCache As Microsoft.ApplicationServer.Caching.DataCache
    Get
        If IsNothing(_DataCache) Then
             SynchLock _DataCacheLock)
                 If IsNothing(_DataCache) Then
                     _DataCache = DataCacheFactory.GetDefaultCache
                 End If
             End SynchLock
        End If

        Return _DataCache

    End Get
End Property

Важно иметь статический DataCacheFactory не только для того, чтобы избежать дорогостоящей инициализации, но и потому, что для каждого из этих создаваемых объектов используется одно из немногих имеющихся у вас соединений с кешем (вы получаете только 5 с наименьшим размером кеша). ).

Статические переменные будут оставаться в области видимости, пока веб-роль или пул приложений не будут перезапущены.

Как вы узнали, что DataCacheFactory воссоздается?

0 голосов
/ 03 июля 2011

Если вы используете несколько служб, ключевое слово shared не принесет вам большой пользы.Посмотрите на этот ответ .Несколько процессов будут иметь несколько отдельных доменов приложений.Я не уверен, как AppDomain активируется хостом IIS, но вы должны это проверить.

PS: Ваш вопрос не совсем понятен.Что вы подразумеваете под глобальной переменной?Что-то, что могут видеть все процессы?Какое отношение к этому имеет характер Azure в Azure?Это означает что-то совершенно другое.

0 голосов
/ 03 июля 2011

Добавьте проверку конструктору вашего сервиса. Если объект dataCache пуст, инициализируйте его, в противном случае - нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...