2011-12-29 8 views
2

Raven.Server.exe.config에서 낙관적 동시성을 true로 설정하는 방법이 있습니까? 아니면 데이터베이스 수준에서 어떻게 든 적용될 수 있습니까? RavenDB의 사이트에, 나는 몇이 UseOptimisticConcurrency이 = 사실 설정의 언급 볼 수 있지만,이 코드 내에서 세션 수준에서의 것 같습니다 :Config에 RavenDB UseOptimisticConcurrency가 있습니까?

public void Save<T>(T objectToSave) 
{ 
    using (IDocumentSession session = Database.OpenSession()) 
    { 
     session.Advanced.UseOptimisticConcurrency = true; // This is the setting 
     Guid eTag = (Guid)session.Advanced.GetEtagFor(objectToSave); 
     session.Store(objectToSave, eTag); 
     session.SaveChanges(); 
    } 
} 

내가 그것을 그 설정이 어딘가에 서버 전체에 존재하는지 알고 싶습니다 따라서 코드의 각 세션마다 지정할 필요가 없습니다.

편집 : 위의 코드는 다음 오류를 생성합니다. 편집 2

enter image description here

... 이유를 찾으려고 : 좋아, 내가 진행 상황을 만들고있어. 개체를 검색하고 같은 세션 내에서 을 GetEtagFor()를 호출하면, 유효한 eTag를 얻을 수 있습니다. 그래서 내 주요 질문은 지금 : 클라이언트 UI 내에서 세션을 사용하여 응용 프로그램이 시작될 때 한 번 세션을 열고 마지막에 닫으려면 올바른 방법이 있습니까? 그리고 ... eTag를 저장하는 올바른 방법은 무엇입니까? 위에 코딩 된 방식으로, eTag는 저장하기 직전에 검색됩니다. 잘못된 방법이라고 생각합니다. 개체를 처음 검색 할 때 eTag를 검색해야한다고 생각합니다. 그러나 원래 객체 목록을 가져 왔을 때 각 객체를 반복해야하고 GetEtagFor()를 호출해야합니까? 올바르게 보이지 않습니다 ...

답변

1

Bob, 아니요, UseOptimisticConcurrency는 세션을 열 때 설정해야하는 항목입니다. 그리고 아니요, 전체 응용 프로그램 당 하나의 세션이 잘못되었습니다. 세션 관리에 대한 자세한 내용은이 문서를 참조하십시오 : 그것은 NHibernate에 대해 이야기하지만, 세션 관리 부품뿐만 아니라 ravendb 적용

http://archive.msdn.microsoft.com/mag200912NHibernate

.

+0

개체를로드/쿼리 한 동일한 세션에 개체를 저장해야합니까? 그리고 그 링크가 세션 관리에 대한 정보를 표시하는 곳을 모르겠습니다. –

+0

그건 그렇고, 나는 이것을 발견했다. 어쩌면 이것은 게시 한 링크와 유사합니다. http://msdn.microsoft.com/en-us/magazine/ee819139.aspx –

1

면책 조항 : 이는 권장되는 방법이 아니며, 실제로 클라이언트 응용 프로그램이 살아있을 때까지 살아갈 IDocumentSession을 여는 것은 바람직하지 않습니다. 대체 솔루션은 RavenDB Catch 22 - Optimistic Concurrency AND Seeing Changes from Other Clients에 게시 된 답변을 참조하십시오.

낙천적 인 동시성이 작동하는 것처럼 보입니다. 그래서 나는 다른 것을 돕기 위해 이것을 게시 할 것이라고 생각했습니다.

먼저 DataAccessLayerBase에서 DocumentStore 및 IDocumentSession을 초기화합니다. 클라이언트 응용 프로그램이 실행되고있는 동안 열려 있고 사용됩니다. 저장할 때

public class CustomVariableGroupData : DataAccessLayerBase, ICustomVariableGroupData 
{ 
    public IEnumerable<CustomVariableGroup> GetAll() 
    { 
     return Session.Query<CustomVariableGroup>(); 
    } 
} 

마지막으로는 ETAG을 얻고 저장 : 데이터를 검색 할 때

public abstract class DataAccessLayerBase 
{ 
    protected static DocumentStore Database { get; private set; } 

    protected static IDocumentSession Session { get; private set; } 

    static DataAccessLayerBase() 
    { 
     if (Database != null) { return; } 

     Database = GetDatabase(); 
     Session = GetSession(); 
    }   

    private static DocumentStore GetDatabase() 
    { 
     string databaseUrl = ConfigurationManager.AppSettings["databaseUrl"];    

     DocumentStore documentStore = new DocumentStore(); 

     try 
     { 
      documentStore.Url = databaseUrl; 
      documentStore.Initialize(); 
     } 
     catch 
     { 
      documentStore.Dispose(); 
      throw; 
     } 

     return documentStore; 
    } 

    private static IDocumentSession GetSession() 
    { 
     IDocumentSession session = Database.OpenSession(); 

     session.Advanced.UseOptimisticConcurrency = true; 

     return session; 
    } 
} 

다음으로, 기존 세션을 사용합니다.

public class GenericData : DataAccessLayerBase, IGenericData 
{ 
    public void Save<T>(T objectToSave) 
    { 
     Guid eTag = (Guid)Session.Advanced.GetEtagFor(objectToSave); 
     Session.Store(objectToSave, eTag); 
     Session.SaveChanges(); 
    } 
} 

다른 UI 인스턴스가 실행 중이고 개체가 변경되면 병행 예외가 발생합니다. 그리고 그것이 우리가 원했던 것입니다.

방금이 게시물의 제목을 다시 살펴본 결과 서버 구성 파일에서 동시성을 설정하는 방법에 대한 질문에 대답하지 않는다는 것을 알았습니다. 그러나 이제 데이터 레이어에 으로 설정하면 충분합니다.

+0

Bob,이 답변을 편집하여 클라이언트 응용 프로그램이 살아있을 때만 IDocumentSession을 여는 것이 좋지는 않다는 것을 분명히 말하십시오. 이것은 이것을 읽는 다른 사람들에게 혼란을 일으킬 수 있습니다. 감사. –

+0

Daniel, 삭제해도 괜찮습니다. 나는 내가 여기 필요한 것을 할 수 있었다 : http://stackoverflow.com/questions/8675958/ravendb-catch-22-optimistic-concurrency-and-seeing-changes-from-other-clients –

+0

예, 압니다. 그래서 다른 사람들이 같은 경로를 따를 필요가 없도록이 글을 편집하도록 요청한 것입니다. 다른 사람들에게 가치를 제공 할 수 있으므로 삭제하지 않는 것이 좋습니다. 고지와 링크를 그 위에 놓으면 괜찮을거야. –