2014-11-06 14 views
1

비슷한 문제가 발생한 사람에게서 아이디어를 얻고 싶습니다. 어떻게 해결책을 찾았습니까?최대 30 개 요청으로 RavenDb 쿼리 오류

기본적으로 RavenDB에 저장된 약 10,000 개의 문서가 있습니다. 또한 사용자가 해당 문서에 대해 필터 및 검색을 수행 할 수 있어야합니다. RavenDb에는 최대 1024 페이지 크기가 있음을 알고 있습니다. 따라서 필터와 검색 기능이 작동하려면 페이징을해야합니다. 나는 그것을 주위 using 키워드를 포장하고 명시 적으로 어떤 성공 RavenDb 모든 호출 후 Dispose를 호출하여 세션을 폐기의 여러 가지 방법을 시도

The maximum number of requests (30) allowed for this session has been reached.

:하지만 내 솔루션은 나에게 다음과 같은 오류를 제공합니다.

누구든지이 문제를 해결하는 방법을 알고 있습니까? 이런 종류의 시나리오에서 가장 좋은 방법은 무엇입니까?

var pageSize = 1024; 
var skipSize = 0; 
var maxSize = 0; 

using (_documentSession) 
{ 
    maxSize = _documentSession.Query<LogEvent>().Count(); 
}         

while (skipSize < maxSize) 
{ 
    using (_documentSession) 
    { 
     var events = _documentSession.Query<LogEvent>().Skip(skipSize).Take(pageSize).ToList(); 

     _documentSession.Dispose();    

     //building finalPredicate codes..... which i am not providing here.... 

     results.AddRange(events.Where(finalPredicate.Compile()).ToList()); 

     skipSize += pageSize; 
    } 
} 
+0

andrew 사용자가 1024 개 이상의 문서를 한 번에 볼 수 있어야합니까? '_documentSession'이 어떻게 생성되었는지 보여주는 코드를 게시 할 수 있습니까? – wal

+0

이 줄에서'ToList()'를 호출하는 것으로 나타났습니다.'var events = _documentSession' <- 이것은 1024 *를 꺼내고 나서 당신의 조건이 적용될 것입니다. 필터를 쿼리에 전달하려고 시도해야합니다. – wal

+0

좋은 점은 쿼리를 최적화한다는 것입니다. 하지만 실제로 루트 문제를 해결하지는 않을 것이라고 생각합니다. – developer

답변

1

Raven은 세션 당 요청 (로드, 쿼리 등) 수를 30 개로 제한합니다. 이 동작은 documented입니다.

코드에서 세션을 처리하는 것을 볼 수 있습니다. 그러나 나는 당신이 세션을 재창조하는 곳을 보지 못했다. 데이터를로드하는 방법은 not a good idea입니다.

우리는 인덱스와 페이징 및 결코 부하를 사용하는 이상 1024

을 사용하여 인덱스대로 작동하지 않습니다 문서 수천 또는 precicate 로직을 기대하고 있다면 당신은 걱정하지 않는다 귀하의 질의에 소요되는 시간은 unbounded results API입니다.

var results = new List<LogEvent>(); 
var query = session.Query<LogEvent>(); 

using (var enumerator = session.Advanced.Stream(query)) 
{ 
    while (enumerator.MoveNext()) 
    { 
     if (predicate(enumerator.Current.Document)) { 
      results.Add(enumerator.Current.Document); 
     } 
    } 
} 

문서의 양에 따라 많은 양의 RAM이 사용됩니다.