0

顧客向けに新しいシステムを開発しており、約 23600 人のメンバーを含むメンバー テーブルがあります。そして、それらをすべて取得しようとすると、タイムアウトになります。SQL プロファイラーを使用して質問を取得し、個別に実行しましたが、約 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);

この問題や修正方法について何か知っている人はいますか?

4

1 に答える 1

1

非常に大きなデータセットを取得することはお勧めできません。メモリ消費について考えてみましょう。このデータを処理する必要がある場合は、バッチ処理(最大 1000 アイテム) を検討してください。ユーザーにデータを提示する必要がある場合は、ページングを検討してください。取得したデータセットを減らすことができない場合は、タイムアウトを増やすことができますが、推奨される方法ではありません。

于 2011-09-30T07:32:00.487 に答える