2011-11-08 5 views
0

J'ai un fichier xml que je suis en train de lire et de sauvegarder des enregistrements existants dans une base de données.Fluid nhibernate batch save

Je lis le fichier xml dans une liste d'objets C# et parcoure les objets en recherchant l'enregistrement correspondant dans la base de données et le mettre à jour à partir des valeurs xml/C#.

Je puis enregistrez cet objet - mais est-il un moyen de nihibernate couramment pour ajouter l'objet à une liste (peut-être 1000s des dossiers) et bacth sauver

Bottom line, il est la performance que je suis AFER - je été en utilisant subsonic 2 et 3 et ont opté pour subsonic 2 car il était beaucoup plus rapide - mais je me demandais juste des vues sur l'utilisation de nhibernate fluent pour le faire - exemples etc

Répondre

0

la session a un cache qui est ce que vous voulez. Si vous avez activé le traitement par lots dans la configuration de l'atelier de session, les opérations suivantes sont mises en lots par lots:

using (var tx = session.BeginTransaction()) 
{ 
    const int BATCH_SIZE = 1000; 
    IList<MyObjects> myobjects = ReadInXML(); 
    Dictionary<int, MyObjects> batch = new Dictionary<int, MyObjects>(BATCH_SIZE); 
    for (int i = 0; i < myobjects.Count; i++) 
    { 
     batch.Add(myobjects[i].Id, myobjects[i]); 
     if (batch.Count < BATCH_SIZE) 
      continue; 

     var entities = session.QueryOver<MyEntity>() 
      .WhereRestrictionOn(x => x.Id).IsIn(batch.Keys) 
      .List(); 

     foreach (var entity in entities) 
     { 
      Update(entity, batch[entity.Id]); 
     } 

     // the session knows all entities it has loaded, no need for session.Update(); 
     session.Flush(); 
     // remove all processed entities from the session cache to speed up things 
     session.Clear(); 
     // prepare for next batch 
     batch.Clear(); 
    } 

    tx.Commit(); 
} 
Questions connexes