2011-07-03 167 views
2

我有一系列WCF Web服务托管在Windows Azure中,我试图实现appfabric缓存。Azure Appfabric缓存+ WCF Web服务

我很苦恼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 

但是当我尝试使用它,它似乎是走出去的范围并且正在重复重新创建,而不是每个天青实例只重复一次。如果我正确理解的东西,那么这基本上归结为.....我在哪里可以存储一个全局变量在一个wcf Web服务,以便它不会超出范围。

+0

为什么downvote?这似乎是一个合理的问题。 –

+0

您的WCF实例是如何托管的?具有Web角色的IIS或自我托管在工作角色中的IIS? –

+0

它位于IIS Web角色中。 –

回答

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

+0

谢谢我添加了这个。正是因为我缺乏联系,并且遇到了一个错误,所以我认为这已经超出了范围。我会让你们都知道的。 –

+0

您还需要确保在应用程序停止时正确处理DataCacheFactory,以确保它正确释放连接,并且还使用4月更新到应用结构SDK(2001-07-01发布),因为它具有关于释放连接的修复程序 – knightpfhor

+0

我将此标记为答案,因为它确实解决了连接问题。然而,我已经恢复到httpruntime.cache。试了一下后,它似乎没有对应用程序产生任何影响,可能会慢一点。谢谢大家的帮助。 –

0

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

0

如果您使用的是多种服务,那么shared关键字不会对您有所帮助。看看this answer。多个进程将具有多个/单独的AppDomain。我不确定AppDomain是如何被IIS主机激活的,但你应该检查一下。

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

+0

我在网络服务的情况下没有连接,也不太确定单身人士的生活。 –