2017-06-12 25 views
3

私はNHibernateの上のステートレスセッションとINSERTコマンドを使用するときに私が見つけた行動に意見したいと思います(NBを。私はNHibernateは2.1.2を使用)NHibernateはステートレス挿入動作

場合は、この

ですステートレス・セッションの
//STATEFULL SESSION 
var session = sessionFactory.OpenSession() 
using(var transaction = session.BeginTransaction()){ 
    var entity = new MyEntityType(); 
    entity.Id = 1; 

    session.Save(entity); 

    var entity2 = session.Get<MyEntityType>(1); 
    //OK! It returns saved entity...as I expect 

    transaction.Commit(); 
} 

けど...、...

//STATELESS SESSION 
var session = sessionFactory.OpenStatelessSession() 
using(var transaction = session.BeginTransaction()){ 
    var entity = new MyEntityType(); 
    entity.Id = 1; 

    session.Insert(entity); 

    var entity2 = session.Get<MyEntityType>(1); 
    //entity2 IS NULL!!! Why? 

    transaction.Commit(); 
} 

私の質問は、私はすでにステートレスセッションのトランザクション・スコープにアイテムを挿入した場合、私は確認することができますどのように...動作の変更ですか?

+0

NHibernateが持っている作業単位パターンがアプリケーションに実装されていますか? –

答えて

2

まあ、ステートレスです...ステートレスです。したがって、挿入されたエンティティをメモリから戻すためのセッションキャッシュはありません。

なぜ、データベースに読み込まれないのですか?まだそこにはないから!

ほとんどの場合、adonet.batch_size xml設定パラメータ、コードEnvironment.BatchSize設定プロパティ、またはセッションファクトリレベルで有効になっている間にIStatelessSession.SetBatchSize(int)で無効にしていない可能性があります。バッチ処理が有効になっている場合、Hibernateデータベース・ドライバがサポートしている場合、DML操作は、構成されたバッチ・サイズまで可能な限りまとめてバッチ処理され、データベースにフラッシュされます。

だから、ステートレスセッションで、このようなフラッシュが発生する可能性があります。

  • 実行する操作の「バッチサイズ」のカウントに達した場合。
  • トランザクションがコミットされている場合。
  • パラメータ値だけでなく、別のDMLクエリが実行された場合。
    (挿入後に別の種類のエンティティを挿入する、挿入後に何らかのエンティティを更新または削除するなど)
  • 明示的にバッターをフラッシュし、内部セッションインターフェイスをタップします。あなたはInsertすぐにデータベースに送信をしたい場合は
    s.GetSessionImplementation().Flush();

、バッチ処理を無効にします。 0に設定すると無効になります。

しかし、なぜあなたは最初にステートレスセッションを使用していますか?多くのエンティティを効率的な方法で挿入する可能性があります。このような場合、バッチ処理を無効にすると目的が得られます。

代わりに、セッションGetSessionImplementation()メソッドによって公開されている内部セッションインターフェイスにアクセスし、明示的にFlushにアクセスすることができます。しかし、内部的に直接呼び出しを行うと、未定義の動作が生じる可能性があるので、これは推奨される方法ではありません。

+0

ステートレスセッションはバッチ処理IMOをサポートしていません。 'SetBatchSize()'メソッドの呼び出しは例外をスローします。これは正しいです? –

+0

いいえ、限られた形でサポートしていますが、そうしています。セッション全体のファクトリに対してバッチ処理が無効になっている可能性があります。そのような場合、セッションファクトリはすべてのセッションに対して 'NonBatchingBatcher'を生成し、バッチサイズを設定しようとして失敗します。実際、 'SetBatchSize'は無効でないバッチサイズを変更したり無効にしたりする場合にのみ有効です。 –

関連する問題