【问题标题】:Azure Appfabric Caching + WCF WebservicesAzure Appfabric 缓存 + WCF Web 服务
【发布时间】:2011-09-27 14:49:39
【问题描述】:

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

【问题讨论】:

  • 为什么投反对票?这似乎是一个合理的问题。
  • 您的 WCF 实例是如何托管的?具有 Web 角色或以辅助角色自托管的 IIS?
  • 它托管在 IIS Web 角色中。

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


【解决方案1】:

据我所知,您的代码应该按照您希望的方式执行。我建议的唯一一件事(与您的问题无关)是对创建进行一些锁定,例如对于您最短的财产:

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

【讨论】:

  • 谢谢我添加了这个。正是因为我的连接用完并出现错误,才让我认为这超出了范围。一会我会告诉大家的。
  • 您还需要确保在应用程序停止时正确处理 DataCacheFactory,以确保它正确释放连接并使用应用结构 SDK 的 4 月更新(发布于 2001- 07-01)因为它有一个关于释放连接的修复
  • 我将此标记为答案,因为它确实解决了连接问题。然而,我已经恢复到 httpruntime.cache。在尝试了这个之后,它似乎对应用程序没有任何影响,而且速度可能有点慢。谢谢大家的帮助。
  • ps 当我想引入更多缓存时,我会再看一下这个,但现在我没有缓存很多,所以对现有缓存没问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我的连接用完了,对于网络服务的单例生命周期不太确定。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多