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 インスタンスごとに 1 回だけではなく、繰り返し再作成されているようです。私が物事を正しく理解している場合、これは基本的に次のようになります.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

コストのかかる初期化を回避するだけでなく、作成するこれらのオブジェクトのそれぞれについて、数少ないキャッシュ接続の1つを使用するため(キャッシュサイズが最小の場合は5つしか取得できないため)、静的DataCacheFactoryを使用することが重要です。

Webロールまたはアプリケーションプールが再起動されない限り、静的変数はスコープ内にとどまります。

DataCacheFactoryが再現されていることをどのように捉えていますか?

于 2011-07-03T19:20:55.920 に答える
0

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

于 2011-07-03T16:37:45.527 に答える
0

複数のサービスを使用している場合、sharedキーワードはあまり役に立ちません。この答えを見てください。複数のプロセスには、複数の/個別の AppDomains があります。IIS ホストによって AppDomain がどのようにアクティブ化されるかはわかりませんが、確認してください。

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

于 2011-07-03T18:38:24.067 に答える