我在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服务中存储全局变量,以便它不会超出范围。
答案 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的无状态性质与此有什么关系?这意味着完全不同的东西。