我有幾個XML文件,每個文件都包含'根對象'的數據,我使用Linq解析XML,然後創建實際的根對象,我堅持使用NHibernate和尖銳的架構庫。我已經開始優化數據插入,並在大約1小時40分鐘內向數據庫中添加30000個對象。但是,這仍然太慢。NHibernate插入/查找性能
我認爲一個瓶頸就是數據庫中需要IO的對象查找。對象必須查找重用。
根對象有幾個作者:
public virtual IList<Author> Authors { get; set; }
作者有這樣的結構:
public class Author : Entity
{
public virtual Initials Initials { get; set; }
public virtual ForeName ForeName { get; set; }
public virtual LastName LastName { get; set; }
}
我以一個類型ID(這是我通常不會做取得了巨大的加速):
public class LastName : EntityWithTypedId<string>, IHasAssignedId<string>
{
public LastName()
{
}
public LastName(string Id)
{
SetAssignedIdTo(Id);
}
public virtual void SetAssignedIdTo(string assignedId)
{
Id = assignedId;
}
}
我仰望(可能創建)像這樣:
LastName LastName = LastNameRepository.Get(TLastName);
if (LastName == null)
{
LastName = LastNameRepository.Save(new LastName(TLastName));
LastNameRepository.DbContext.CommitChanges();
}
Author.LastName = LastName;
我期待作家像這樣:
propertyValues = new Dictionary<string, object>();
propertyValues.Add("Initials", Author.Initials);
propertyValues.Add("ForeName", Author.ForeName);
propertyValues.Add("LastName", Author.LastName);
Author TAuthor = AuthorRepository.FindOne(propertyValues);
if (TAuthor == null)
{
AuthorRepository.SaveOrUpdate(Author);
AuthorRepository.DbContext.CommitChanges();
Root.Authors.Add(Author);
}
else
{
Root.Authors.Add(TAuthor);
}
我能提高嗎?我應該使用存儲過程/ HQL /純SQL/ICriteria來執行查找嗎?我可以使用某種形式的緩存來加速查找並減少IO嗎? CommitChanges似乎是必要的,或者我應該把所有事情都包含在交易中?
我已經每10個根對象刷新會話等。
任何反饋將非常歡迎。提前謝謝了。
最良好的祝願,
基督教
我結束了使用xsd2code。請確保如果您的xml包含dtd信息,請使用:BlaClassBlaClass =((BlaClass)(serializer.Deserialize(System.Xml.XmlReader.Create(new XmlTextReader(filepath),new System.Xml.XmlReaderSettings(){ProhibitDtd = false })))); – cs0815 2010-08-16 09:49:37