2011-09-30 64 views
0

我們正在爲客戶開發一個新系統,並且我們有一個約23600個成員的成員表。當我們試圖讓它們全部超時時。我已經使用sql profiler來獲得問題並單獨運行它,並花了大約3秒。nHibernate大查詢超時

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

任何人都知道這個問題,或者如何解決它什麼?

+0

是否增加線性時間(setmaxresults 100,200,300)?國際海事組織在開放有限的集合中應該總是處理批次(分頁)。 – Firo

+0

如果你只是想抓住這些成員導入其他地方,然後考慮使用無狀態會話 – Rippo

回答

1

提取這麼大的數據集不是一個好主意。考慮內存消耗。如果您需要處理此數據,請考慮處理批次(最多1000個項目)。如果您需要現在的數據給用戶,請考慮分頁。如果不能減少提取的數據集,可以增加超時,但不推薦實踐。