2011-07-03 2 views
2

Windows Azure에서 호스팅되는 일련의 WCF 웹 서비스가 있고 appfabric 캐싱을 구현하려고합니다.Azure Appfabric Caching + WCF Webservices

저는 웹 서비스의 무국적 특성과 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 웹 서비스에 전역 변수를 저장하여 범위를 벗어나지 않게 할 수 있습니다.

+0

왜 downvote? 이것은 합리적인 질문처럼 보입니다. –

+0

WCF 인스턴스는 어떻게 호스팅됩니까? 웹 역할이 있거나 작업자 역할에서 자체 호스팅되는 IIS? –

+0

IIS 웹 역할에서 호스팅됩니다. –

답변

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 개만 가져옵니다).

정적 변수는 웹 역할이나 응용 프로그램 풀이 다시 시작되지 않는 한 범위를 유지합니다.

DataCacheFactory은 어떻게 재 작성 중입니까?

+0

감사합니다. 연결이 끊어져서 오류가 발생하여 이것이 범위를 벗어난 것이라고 생각하게되었습니다. 나는 너에게 모든 것을 조금 알려줄 것이다. –

+0

DataCacheFactory를 올바르게 처리하여 응용 프로그램이 중지되어 연결이 제대로 해제되는지 확인하고 4 월 업데이트를 사용하여 응용 프로그램 패브릭 SDK (2001-07-01)에 사용했는지 확인할 수도 있습니다. 연결 해제에 관한 수정 – knightpfhor

+0

연결 문제를 해결했기 때문에이를 답변으로 표시하고 있습니다. 그러나 나는 httpruntime.cache로 복귀했다. 그것을 밖으로 시도한 후 그것은 응용 프로그램에 어떤 차이를 만드는 것 같지 않았고 아마도 조금 느린 것입니다. 모든 도움을 주신 모든 분들께 감사드립니다. –

0

서비스 생성자에 확인을 추가하십시오. dataCache 객체가 비어 있으면 초기화하고, 그렇지 않으면 초기화하지 않습니다.

0

여러 서비스를 사용하는 경우 shared 키워드가 도움이되지 않습니다. this answer을보십시오. 다중 프로세스에는 여러/개별 AppDomains가 있습니다. AppDomain이 IIS 호스트에 의해 활성화되는 방법을 잘 모르겠습니다. 체크 아웃해야합니다.

피씨 : 귀하의 질문은 명확하지 않습니다. 전역 변수는 무엇을 의미합니까? 모든 프로세스에서 볼 수있는 것이 있습니까? Azure의 상태 비 저장 속성은 무엇을해야합니까? 그것은 완전히 다른 것을 의미합니다.

+0

웹 서비스의 경우 싱글 톤의 수명이 너무 짧았습니다. –