2

我在 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 服务中,这样它就不会超出范围。

4

3 回答 3

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正在重新创建的?

于 2011-07-03T19:20:55.920 回答
0

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

于 2011-07-03T16:37:45.527 回答
0

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

PS:你的问题不是很清楚。全局变量是什么意思?所有进程都可以看到的东西?Azure 的无状态特性与此有什么关系?这意味着完全不同的东西。

于 2011-07-03T18:38:24.067 回答