Максимально допустимые запросы на исключение сеанса - Обходной путь - PullRequest
1 голос
/ 12 января 2012

Я получаю исключение "Максимально допустимое количество запросов на сеанс (30) достигнуто" и т. Д. Я пытаюсь выполнить запрос RavenDB внутри цикла for, и мне интересно, как я могу обойти это. Код ниже.

  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;
             }                     

        }               

Записи в запросе находятся в сотнях, и мне нужно выполнить запрос подсчета внутри цикла for, я не вижу другого способа выполнить запрос вне цикла .. потому что мне нужно запустить этот запрос для каждого из предметы в списке. Спасибо за помощь.

Ответы [ 3 ]

4 голосов
/ 12 января 2012

ZVenue, это прекрасный пример для индекса Multi Maps / Reduce:

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)
                                       };
    }
}

В качестве дополнительного примечания: вам не следует запрашивать неограниченный набор результатов - вместо этого используйте .Take().

0 голосов
/ 12 января 2012

Так что, как предлагает @Tobias, лучший метод, но вы можете изменить максимальное количество запросов. Это делается путем установки свойства MaxNumberOfRequestPerSession. Это может быть установлено в сеансе. Advanced / MaxNumberOfRequestPerSession.

Идея и подробности здесь: http://ravendb.net/documentation/safe-by-default

0 голосов
/ 12 января 2012

Это должно решить вашу проблему:

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;
    }
} 

Это также будет намного быстрее, чем сотни запросов к БД - особенно если к БД обращаются по сети.

...