Azure Appfabric缓存+ WCF Web服务

时间:2011-07-03 12:27:44

标签: wcf web-services azure appfabric azure-caching

我在Windows Azure中托管了一系列WCF Web服务,我正在尝试实现appfabric缓存。

我正在努力解决Web服务的无状态特性以及避免昂贵的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 Web服务中存储全局变量,以便它不会超出范围。

3 个答案:

答案 0 :(得分:2)

从我所看到的,您的代码应该按照您希望的方式执行。我建议的唯一一件事(与你的问题无关)就是在创作中加入一些锁定,例如:为您最短的财产:

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个具有最低缓存大小的缓存连接) )。

除非重新启动Web角色或应用程序池,否则静态变量将保留在范围内。

你是如何发现正在重建DataCacheFactory的?

答案 1 :(得分:0)

将检查添加到服务的构造函数中。如果dataCache对象为空,则初始化它,否则不要。

答案 2 :(得分:0)

如果您使用多项服务,shared关键字对您没有多大好处。看看this answer。多个进程将具有多个/单独的AppDomain。我不确定IIS主机是如何激活AppDomain的,你应该检查一下。

P.S。:你的问题不是很清楚。全局变量是什么意思?所有流程都能看到的东西? Azure的无状态性质与此有什么关系?这意味着完全不同的东西。