Кэширование Azure Appfabric + веб-службы WCF

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

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

Я завернул свой datacachefactory в синглтон, так как это было хорошим местом для начала.....

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

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


person David Steele    schedule 03.07.2011    source источник
comment
Почему минус? Это кажется резонным вопросом.   -  person David Steele    schedule 03.07.2011
comment
Как размещен ваш экземпляр WCF? IIS с веб-ролью или с собственной рабочей ролью?   -  person Drew Marsh    schedule 03.07.2011
comment
Он размещается в веб-роли IIS.   -  person David Steele    schedule 03.07.2011


Ответы (3)


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

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 воссоздается?

person knightpfhor    schedule 03.07.2011
comment
Спасибо, я добавил это. Именно из-за того, что у меня заканчивались соединения и я получал сообщение об ошибке, я подумал, что это выходит за рамки. Я дам вам все знать в немного. - person David Steele; 04.07.2011
comment
Вы также должны убедиться, что вы правильно утилизируете DataCacheFactory, когда приложение останавливается, чтобы убедиться, что оно правильно освобождает соединение, а также использовать апрельское обновление для SDK ткани приложения (выпущено 2001-07-01), потому что оно имеет исправление относительно освобождения соединений - person knightpfhor; 04.07.2011
comment
Я отмечаю это как ответ, потому что это решило проблемы с подключением. Однако я вернулся к httpruntime.cache. После того, как вы попробовали это, похоже, это не имело никакого значения для приложения и, возможно, было немного медленнее. Спасибо всем за вашу помощь. - person David Steele; 04.07.2011
comment
ps Я посмотрю на это снова, когда захочу ввести больше кэширования, но пока я не кэширую много, поэтому меня устраивает существующий кеш. - person David Steele; 04.07.2011

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

person Frode Stenstrøm    schedule 03.07.2011

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

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

person Anže Vodovnik    schedule 03.07.2011
comment
У меня заканчивались соединения, и я не был слишком уверен насчет времени жизни синглтона в случае веб-службы. - person David Steele; 04.07.2011