2008-11-09 5 views
3

우리는 WCF 기반 시스템을 개발 중입니다. 이 과정에서 우리는 한 명 이상의 사용자가 수정하지 못하도록 일부 데이터를 잠 그려하고 있습니다. 그래서 우리는 (예를 들어, 잠긴 객체의 ID를 저장하여) 실행하기위한 잠금 로직에 필요한 정보를 포함 할 데이터 구조를 갖기로 결정했습니다.세션 간 WCF 데이터 지속성

문제는 세션간에 데이터를 지속시키는 것입니다. 어쨌든 값 비싼 데이터베이스 호출을 피할 수 있습니까? 오픈 세션 중에 만 데이터를 메모리에 유지할 수 있기 때문에 WCF에서 어떻게 할 수 있는지 잘 모르겠습니다.

답변

0

아마 velocity과 같은 캐싱 프레임 워크가 도움이 될 것입니다.

0

두 번째 클래스를 만들고 InstanceContextMode를 single로 설정 한 다음 비싼 모든 메서드를 원래 클래스로 이동 한 다음 해당 메서드를 사용합니다.

4

서비스 구현 클래스의 정적 멤버는 세션 & 사이에서 공유됩니다.

3

지미 맥 널티 (Gimmy McNulty)가 말한 것처럼 정적 멤버를 사용하는 옵션도 있습니다. 사용자 지정 IP 주소를 기반으로 네트워크 연결을 여는 WCF 서비스가 있습니다. 내 서비스는 PerCall 서비스 인스턴스 모드로 구성됩니다. 각 세션에서 정적 데이터 구조를 검사하여 지정된 IP 주소에 대해 네트워크 연결이 이미 열려 있는지 확인합니다. 여기에 예제가 있습니다.

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    void Start(IPAddress address); 
} 

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class MyService : IMyService 
{ 
    private static readonly List<IPAddress> _addresses = new List<IPAddress>(); 
    public void Start(IPAddress address) 
    { 
     lock(((ICollection)_addresses).SyncRoot) 
     { 
      if (!_addresses.Contains(address) 
      { 
       // Open the connection here and then store the address. 
       _addresses.Add(address); 
      } 
     } 
    } 
} 

구성한대로 Start() 호출은 자체 서비스 인스턴스 내에서 발생하며 각 인스턴스는 정적 컬렉션에 액세스 할 수 있습니다. 각 서비스 인스턴스는 별도의 스레드 내에서 작동하기 때문에 컬렉션에 대한 액세스가 동기화되어야합니다.

멀티 스레드 프로그래밍에서 수행 된 모든 동기화와 마찬가지로 잠금 시간을 최소화해야합니다. 표시된 예에서 첫 x 째 호출자가 잠금을 잡으면 다른 모든 호출자는 잠금이 해제 될 때까지 대기해야합니다. 이것은 내 상황에서 작동하지만, 당신의 상황에서는 작동하지 않을 수 있습니다.

다른 옵션은 PerCall 서비스 인스턴스 모드와 달리 단일 서비스 인스턴스 모드를 사용하는 것입니다.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
public class MyService : IMyService 
{ ... } 

내가 읽은 모든 것에서, PerCall은보다 유연 해 보입니다.

link의 차이점을 확인할 수 있습니다.

그리고 서비스를 구현하는 클래스가 바로 클래스라는 것을 잊지 마십시오. 모든 C# 클래스처럼 작동합니다. 정적 생성자, 속성, 이벤트 핸들러를 추가하고 추가 인터페이스를 구현할 수 있습니다.