2017-02-14 3 views
1

私は、新しいメッセージが1秒ごとにテーブルに挿入されるプロジェクトに取り組んでいます。 EntityFrameworkには、コンテキストの存続期間をできるだけ短く保つために、コネクションプールと呼ばれるものがあります。コンテキストを破棄します。これはNhibernateセッションに適用されますか?Nhibernateとセッションプーリング

ISessionFactory sf = cfg.BuildSessionFactory(); 
ISession session = sf.OpenSession(); 
While(true) 
{ 
//....... 
    using (var tran = session.BeginTransaction()) 
    { 
     session.SaveOrUpdate(msg); 
     tran.Commit();       
    } 
    Thread.Sleep(1000); 
} 

それとも

ISessionFactory sf = cfg.BuildSessionFactory(); 
While(true) 
{ 
//....... 
    using(var session = sf.OpenSession()) 
    { 
    using (var tran = session.BeginTransaction()) 
    { 
     session.SaveOrUpdate(msg); 
     tran.Commit();       
    } 
    Thread.Sleep(1000); 
    } 
} 

の両方が動作しているように見えるが、私はどちらを使用しなければなりませんか?

+0

[NHibernateセッションをいつ開くことができますか?](http://stackoverflow.com/questions/1243835/how-long-can-should-an-nhibernate-session-be-kept -open) – Fran

+0

'SessionFactory'インターフェースの' OpenStatelessSession'メソッドを見てみる価値があります。ステートレスセッションのコンセプトは、あなたがやっていることに適しているようです。 –

答えて

1

まあ、私はあなたの質問に答えることにした場合:

コードブロックがより適切であるが。実際には、接続プールはNHibernateとは関係ありません。基礎となるRDBMSの動作です。

NHibernateでは、SessionFactoryを作成するのはコストがかかり、アプリケーションの有効期間内に(起動時に理想的に)1回だけ実行する必要があります。 ISessionを作成するのはコストがかかりません。セッションはできるだけ短くすることをお勧めします。ただ答えるよりも

より:別に短い葉のセッションから

を、あなたもUnitOfWork(「セッションあたりの会話」、すなわち適切にトランザクションとセッションを使用して)最初のレベルのキャッシュの利点を向上させるための実装を検討すべきであり、バッチ処理。

第1レベルのキャッシュはセッションごとです。新しいセッションで各DB呼び出しを実行すると、効果的にキャッシュの利点が得られません。

バッチ処理についても同じです。バッチ処理は、トランザクションの処理方法に基づいて行われます。 tran.Commit();への電話は、nhSession.FlushMode,nhSession.SetBatchSizeなどの他のプロパティと一緒に重要な役割を果たします。記事を参照してくださいthis
バッチ処理を実装するには、最初にコードブロックを改善し、トランザクションをusingブロックにコミットするのではなく、ループの反復回数を100回(または10または500回)に行います。

thisthisをご参照ください。

thisを参考にして、コメントで@Franと答えてください。

+0

ありがとう!これは私を助けます。しかし、私の場合、ソースデータは物理デバイスから取得され、毎秒1ピースを生成します。だから私が言ったようにバッチ処理をすると、セッションはコミットして処分される前に500秒間生きる必要があり、これが最初のルールに違反する可能性があります。 – joe

+0

同意する。この場合、バッチ処理はあなたを助けません。 –