У меня есть несколько XML-файлов, и каждый файл содержит данные «корневых объектов», которые я анализирую с использованием Linq для XML, а затем создаю фактические корневые объекты, которые я сохраняю, используя NHibernate и репозиторий резкой архитектуры. Я начал оптимизировать ввод данных и управлять добавлением 30000 объектов примерно через 1 час 40 минут в базу данных. Однако это все еще слишком медленно.Производительность вставки/поиска NHibernate
Я думаю, что одна бутылка шеи - это поиск объектов в базе данных, требующих ввода-вывода. Объекты нужно искать для повторного использования.
Корневой объект имеет несколько авторов:
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/pure SQL/ICriteria для выполнения поиска? Могу ли я использовать некоторую форму кеширования, чтобы ускорить поиск и уменьшить IO? Кажется, что CommitChanges необходимо, или я должен все превратить в транзакцию?
Я уже очищаю свою сессию и т. Д. Каждые 10 корневых объектов.
Любая обратная связь будет очень радушна. Спасибо заранее.
С наилучшими пожеланиями,
Christian
В итоге я использовал xsd2code. убедитесь, что если ваш xml содержит данные dtd, используйте: BlaClassBlaClass = ((BlaClass) (serializer.Deserialize (System.Xml.XmlReader.Create (новый XmlTextReader (путь к файлу), новый System.Xml.XmlReaderSettings() {ProhibitDtd = false })))); – cs0815