2011-07-03 14 views
2

Windows Azureでホストされている一連のWCF Webサービスがあり、appfabricキャッシングを実装しようとしています。Azure Appfabric Caching + WCF Webservices

私は、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インスタンスごとに1回ではなく繰り返して再作成されています。私が物事を正しく理解していれば、これは基本的に次のようになります..... 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を持つことが重要ですが、また、あなたが作成し、これらのオブジェクトのそれぞれのために(あなたが持っているいくつかのキャッシュ接続の1つを使用しているため、キャッシュサイズが最小の5つしか得られません)。

スタティック変数は、Webロールまたはアプリケーションプールが再起動しない限り、有効範囲内にとどまります。

DataCacheFactoryはどのように再現されていると思いますか?

+0

ありがとう、私はこれを追加しました。私は接続が不足していて、これが範囲外になっていると私に思い出させたエラーを受け取ったからです。私はあなたに少しでも知ってもらうでしょう。 –

+0

また、アプリケーションが停止したときにDataCacheFactoryを適切に処分して、接続が適切に解放されていることを確認し、AppFabric SDK(2001-07-01リリース)にApril Updateを使用することも必要です接続の解放に関する修正 – knightpfhor

+0

接続の問題を解決したので、これを答えとしてマークしています。しかし、私はhttpruntime.cacheに戻ってきました。これを試した後、アプリに何の違いもないようで、おそらく少し遅かったでしょう。あなたのお手伝いをさせていただき、ありがとうございます。 –

0

サービスのコンストラクタにチェックを追加します。 dataCacheオブジェクトが空の場合は初期化し、そうでない場合は行いません。

0

複数のサービスを使用している場合は、sharedキーワードはあまり役に立ちません。 this answerを見てください。複数のプロセスには、複数の/個別のAppDomainsがあります。私はAppDomainがIISホストによってどのように起動されているかわかりませんが、それを確認してください。

P .:あなたの質問は本当に明確ではありません。グローバル変数はどういう意味ですか?すべてのプロセスが見ることができるもの? Azureのステートレスな性質はこれと何が関係していますか?それはまったく異なる何かを意味します。

+0

私は接続が不足していて、Webサービスの場合にはシングルトンの寿命についてはあまり気にしませんでした。 –

関連する問題