2011-11-08 19 views
0

私はxmlファイルを読み込んでおり、データベースの既存のレコードをuppdatingしています。流暢なnhibernateバッチ保存

私はxmlをc#オブジェクトのリストに読み込み、それらを繰り返してデータベース内の対応するレコードを見つけ、xml/c#値から更新します。

私は、このオブジェクトを保存する - それは私がのaferだパフォーマンスですが、リストにオブジェクトを追加するには流暢nihibernateのいずれかの方法があります(記録の1000年代することができる)と

ボトムラインを保存bacth - 私が持っていますサブソニック2と3を使用していて、それが途方もなく高速だったので、亜音速2を選択しました - しかし、私はちょうどこれを行うために流暢なハイバーネイトを使用することについてどのような意見もありませんでした - 例など

答えて

0

セッションには、セッションファクトリの設定でバッチを有効にしている場合は、次のように更新をバッチします。

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