J'ai plusieurs fichiers XML et chaque fichier contient des données d'objets racines que j'analyse en utilisant Linq en XML, puis crée des objets racine réels que je conserve en utilisant NHibernate et le référentiel d'architecture pointu. J'ai commencé à optimiser l'insertion de données et à ajouter 30000 objets en environ 1 heure et 40 minutes à la base de données. Cependant, c'est encore trop lent.Performances d'insertion/recherche NHibernate
Je pense qu'un col de bouteille est la recherche d'objets dans la base de données qui nécessite des E/S. Les objets doivent être recherchés pour être réutilisés.
L'objet racine a plusieurs auteurs:
public virtual IList<Author> Authors { get; set; }
Les auteurs ont cette structure:
public class Author : Entity
{
public virtual Initials Initials { get; set; }
public virtual ForeName ForeName { get; set; }
public virtual LastName LastName { get; set; }
}
J'ai atteint une grande vitesse par l'aide d'un typé Id (quelque chose que je ne serais pas normalement faire):
public class LastName : EntityWithTypedId<string>, IHasAssignedId<string>
{
public LastName()
{
}
public LastName(string Id)
{
SetAssignedIdTo(Id);
}
public virtual void SetAssignedIdTo(string assignedId)
{
Id = assignedId;
}
}
Ce que je recherche (et potentiellement créer) comme ceci:
LastName LastName = LastNameRepository.Get(TLastName);
if (LastName == null)
{
LastName = LastNameRepository.Save(new LastName(TLastName));
LastNameRepository.DbContext.CommitChanges();
}
Author.LastName = LastName;
Je suis à la recherche des auteurs comme ceci:
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);
}
Puis-je améliorer cela? Devrais-je utiliser des procédures stockées/HQL/pure SQL/ICriteria à la place pour effectuer la recherche? Puis-je utiliser une forme de cache pour accélérer la recherche et réduire les entrées/sorties? Le CommitChanges semble être nécessaire ou devrais-je envelopper tout dans une transaction?
Je vide déjà ma session etc. tous les 10 objets racine.
Tous les commentaires seraient les bienvenus. Merci d'avance.
Meilleurs voeux,
Christian
J'ai fini par utiliser xsd2code. assurez-vous que, si votre fichier XML contient des informations dtd, utilisez: BlaClassBlaClass = ((BlaClass) (serializer.Deserialize (System.Xml.XmlReader.Create (nouveau XmlTextReader (chemin de fichier), new System.Xml.XmlReaderSettings() {ProhibitDtd = false })))); – cs0815