2017-05-15 6 views
0

以前は、1つのトランザクションで500回の操作を実行していましたので、foreachブロックで500回トランザクションを変更する必要がありました。nHibernateの複数のトランザクションが遅くなりました

私は各トランザクションの作成(私はストップウォッチを使用)をチェックしており、foreachループ(すべての新しいトランザクション)が以前のものよりも少し長くなっていることに気付きました。 〜80ミリ秒から〜400に上がった。私のコード:

foreach (var single in data) 
{ 
    using (var tran = _session.BeginTransaction()) 
    { 
     // operations with "single" usage - _session.Save() or _session.Update() 
     //... 
     tran.Commit(); 
    } 
} 

私は間違っていますか?私は処分すべきでしょうか、何かをtran.Commit()の後に洗い流しますか?

+0

[クエリとコミットの可能な複製は、セッションの存続期間が長くなる](http://stackoverflow.com/questions/43934112/queries-and-commits-take-longer-as-the-session-lives-on ) –

答えて

1

Nhibernateはセッション内の各エンティティの状態を追跡します。したがって、ループの周りでは、より多くのエンティティをチェックする必要があります。

通常、これに対する答えは、トランザクションごとに新しいセッションを作成することです。

ここで問題となるのは、ORMを使用する「チャット」な方法で、通常はアンチパターンと見なされる500の小さなトランザクションがあることです。

NHibernate 3.2バッチ処理は内部的に実装されており、詳細はBatch Update in NHibernateを参照することをお勧めします。

+0

あなたがそれを書いている間、私は_sessionが "Statistics"プロパティにある要素によって膨らんでいることに気付きました。各トランザクションの後、私は_セッションをクリアしました。クリアして、それは私の一日を作ったように見えますが、それを使う際に強い影響があるかどうかはわかりません。 – Staly

+0

[post](/ q/43934112/1178314)にこれに関する議論があります。 –

+0

私は検索中にそれを見つけられませんでした。私はトランザクション間の依存関係がないので、私はそれを使うことができるように見えます。助けてくれてありがとう、みんな。 – Staly

関連する問題