2012-01-11 2 views
1

"세션 당 최대 허용 요청 수 (30 개)에 도달했습니다"등의 예외가 발생했습니다. "for 루프"내에서 RavenDB 쿼리를 실행하려고하는데 내가 이것을 어떻게 할 수 있는지 궁금해. 코드는 다음과 같습니다. 쿼리에세션 당 허용되는 최대 요청 수 예외 - 해결 방법

using (var session = store.OpenSession()) 
     {   
      var MovieList = session.Query<Movies>()          
           .ToList();   

      foreach (var movie in MovieList) 
      { 
       int NumByState = session.Query<Theaters>() 
           .Where(x => x.State == movie.State) 
           .Count(); 

       string MovieName = movie.MovieName; 
      }      

     }    

레코드는 100 단위에 있고 내가 이것을 실행해야하기 때문에 내가 .. 내가 루프의 외부 쿼리를 실행하는 또 다른 방법을 볼 수 없습니다, 루프의 내부 카운트 쿼리를 실행해야합니다 목록의 각 항목에 대한 쿼리 도와 주셔서 감사합니다.

답변

0

이 문제를 해결해야합니다

using (var session = store.OpenSession()) 
{   
    var MovieList = session.Query<Movies>()          
     .ToList(); 
    var states = session.Query<Theaters>() 
     .ToList() 
     .GroupBy(x => x.State) 
     .ToDictionary(x => x.Key, x => x.Count());   

    foreach (var movie in MovieList) 
    { 
     int NumByState = states.ContainsKey(movie.State) 
      ? states[movie.State] 
      : 0; 

     string MovieName = movie.MovieName; 
    } 
} 

이것은 또한 훨씬 빨리 시대의 DB 수백 쿼리보다 것이다 - DB를 네트워크를 통해 액세스 할 수 있습니다 특히.

+0

응답 해 주셔서 감사합니다. GroupBy ... – ZVenue

+0

@ZVenue : 클라이언트가 그룹화를 수행하도록 응답을 업데이트했습니다. – Nuffin

+0

"변경 후 JSON 객체를 'System.String'유형으로 deserialize 할 수 없습니다. – ZVenue

0

@Tobias가 제안한 것처럼 더 나은 방법이지만 최대 요청 수를 변경할 수 있습니다. 이 작업은 MaxNumberOfRequestPerSession 속성을 설정하여 수행됩니다. 이 값은 session.Advanced/MaxNumberOfRequestPerSession에서 설정할 수 있습니다. 여기

아이디어 및 세부 사항 : 사이드 참고로

public class MoviesWithTheatersCount : AbstractMultiMapIndexCreationTask<MoviesWithTheatersCount.ReduceResult> 
{ 
    public class ReduceResult 
    { 
     public string State { get; set; } 
     public string MovieName { get; set; } 
     public int TheaterCount { get; set; } 
    } 

    public MoviesWithTheatersCount() 
    { 
     AddMap<Movie>(movies => from movie in movies 
           select new 
              { 
               State = movie.State, 
               MovieName = movie.Name, 
               TheaterCount = 0 
              }); 

     AddMap<Theater>(theaters => from theater in theaters 
            select new 
               { 
                State = theater.State, 
                MovieName = (string)null, 
                TheaterCount = 1 
               }); 

     Reduce = results => from result in results 
          group result by result.State 
          into g 
          select new 
             { 
              State = g.Key, 
              MovieName = g.Select(x => x.MovieName != null).First(), 
              TheaterCount = g.Sum(x => x.TheaterCount) 
             }; 
    } 
} 

: http://ravendb.net/documentation/safe-by-default

+0

해당 설정을 변경하는 방법을 잘 알고 있습니다.이 솔루션을 사용하려면 숫자를 300으로 높게 설정해야 할 수도 있습니다. 그리고 느린 정도 만이 중요한 것이라면 DB '활동 없음'시간 또는 피크 시간이 아닌 시간에 실행되도록 예약하십시오. – ZVenue

+1

제발 하지마. 그 기본 설정이 아닌 좋은 이유가 있습니다. –

+0

@DanielLang 나는 당신에게 동의하지만 노출의 이유가 있고 어떤 경우에는해야한다. 그러나 나는 피해야 만한다. 그리고 내가 링크를 포함시킨 이유. –

4

ZVenue, 이것은 멀티지도에 대한 완벽한 예입니다/인덱스를 줄 당신이 바운드 형식으로 쿼리 안 결과 집합 - 대신 .Take()을 사용하십시오.

+0

나는 색인을 사용하여 요점과 장점을 참조하십시오 .. 코드 샘플을 주셔서 감사합니다. – ZVenue

+0

AbstractMultiMapIndexCreationTask가 인식되지 않습니다 ..AbstractIndexCreationTask입니다. Raven.Abstractions.Indexing을 사용하여 시도했다. Raven.Client.Indexes를 사용합니다. 나는 무엇을 놓치고 있습니까? – ZVenue

+0

AbstractMultiMapIndexCreationTask 유형은 Raven.Client.Indexes 내에 있습니다. –

관련 문제