Тайм-аут больших запросов nHibernate - PullRequest
0 голосов
/ 30 сентября 2011

Мы разрабатываем новую систему для клиента, и у нас есть таблица участников, насчитывающая около 23600 участников.И когда мы пытаемся получить их все, время истекает.Я использовал sql profiler, чтобы получить вопрос и запустить его отдельно, и это заняло около 3 секунд.

using (ISession s = SessionFactory.OpenSession())
{
   return CreateCriteria(typeof(Member)).List<Member>();                    
}

Похоже, проблема в том, что отображение результата из 23600 объектов занимает слишком много времени.При ограничении результатов для примера 300 (.SetMaxResults (300)) он работает нормально.Сейчас я не знаю, нужно ли нам когда-либо получать всех участников в окончательной системе, но я знаю, что когда придет время, мы бы хотели, чтобы большинство участников создавало свои учетные записи в поставщике членства нашего сайта.

Отображение членов (свободно nHibernate):

        Id(x => x.ID).Default("NEWID()");
        Map(x => x.LegacyID).ReadOnly();
        Map(x => x.Username).Length(32);
        Map(x => x.Password).Length(32);
        Map(x => x.MemberID).Length(10);

        Map(x => x.FirstName).Length(50);
        Map(x => x.LastName).Length(50);
        Map(x => x.Gender).CustomType<int>();
        Map(x => x.BirthDate);
        Component(c => c.Home);
        Map(x => x.Email).Length(80);
        Map(x => x.SendInformation).CustomType<int>();
        Map(x => x.SendInvoice).CustomType<int>();
        Map(x => x.Comment);
        Map(x => x.PublicProfile);
        Map(x => x.EntryDate);
        Map(x => x.ResignationDate);

        References<ProfileItem>(x => x.MemberStatus, "StatusID");
        References<ProfileItem>(x => x.MemberType, "TypeID");
        References<ProfileItem>(x => x.NationalAssociation);
        References<ProfileItem>(x => x.Position, "PositionID");
        References<ProfileItem>(x => x.SpecialSkills, "SpecialSkillsID");
        References<ProfileItem>(x => x.CompanyType, "CompanyTypeID");
        References<ProfileItem>(x => x.JobType, "JobTypeID");
        References<ProfileItem>(x => x.GraduateCity, "GraduateCityID");
        HasManyToMany<ProfileItem>(x => x.Interessts).Table("MemberInterests")
            .ParentKeyColumn("UserID").ChildKeyColumn("ProfileItemID").Cascade.AllDeleteOrphan().Not.LazyLoad();
        HasManyToMany<ProfileItem>(x => x.Properties).Table("MemberProperties")
            .ParentKeyColumn("UserID").ChildKeyColumn("ProfileItemID").Cascade.AllDeleteOrphan().Not.LazyLoad();

        Component(c => c.Company).ColumnPrefix("Work");
        Component(c => c.Invoice).ColumnPrefix("Invoice");

        Map(x => x.Created);
        Map(x => x.CreatedBy).Length(32);
        Map(x => x.LatestChange);
        Map(x => x.LatestChangeBy).Length(32);

        Map(x => x.ElementarySchool);
        Map(x => x.University);
        Map(x => x.GraduateYear);

        Map(x => x.Title).Length(50);

        Map(x => x.LibraryAccess);

Кто-нибудь знает что-нибудь об этой проблеме или как ее исправить?

1 Ответ

1 голос
/ 30 сентября 2011

Получение такого большого набора данных не очень хорошая идея.Подумайте о потреблении памяти.Если вам нужно обработать эти данные, рассмотрите обработку в партиях (до 1000 наименований).Если вам нужно представить данные пользователю, рассмотрите paging .Если вы не можете уменьшить выборочный набор данных, вы можете увеличить время ожидания, но это не рекомендуется.

...