[解決済み] NHibernate ISession Flush。いつ、どこで、なぜそれを使うのか?
質問
私が徹底的に混乱することのひとつは
session.Flush
と併用し
session.Commit
と
session.Close
.
時々
session.Close
は、例えば、私が必要とするすべての変更をコミットします。私は、トランザクションや、いくつかの作成/更新/削除を伴う作業単位がある場合、コミットを使用する必要があることを知っています。
しかし、時々、このロジックに悩まされることがあります。
session.Flush
. のような例を見たことがあります。
session.SaveOrUpdate()
の後にフラッシュが続くのですが、フラッシュを削除すると、とにかく正常に動作します。時々、Flushステートメントでセッションがタイムアウトしたというエラーに遭遇することがありますが、これを削除することでそのようなエラーに遭遇しないようにすることができました。
どなたか、いつどこでFlushを使うか、良いガイドラインをお持ちの方はいらっしゃいませんか?NHibernateのドキュメントをチェックアウトしましたが、まだ明確な答えが見つかりません。
どのように解決するのですか?
簡単に説明します。
- 常にトランザクションを使用する
-
使用しない
Close()
代わりに、呼び出しをISession
の内部でusing
ステートメントまたは ISession のライフサイクルを別の場所で管理します。 .
から ドキュメント :
時折、その
ISession
は、ADO.NET接続の状態とメモリに保持されているオブジェクトの状態を同期させるために必要なSQLステートメントを実行します。この処理、フラッシュは、デフォルトでは以下の時点で発生します。
- のいくつかの呼び出しから
Find()
またはEnumerable()
- から
NHibernate.ITransaction.Commit()
- から
ISession.Flush()
SQL文は以下の順序で発行されます。
- を使用して対応するオブジェクトが保存されたのと同じ順序で、すべてのエンティティが挿入されます。
ISession.Save()
- すべてのエンティティの更新
- すべてのコレクションの削除
- すべてのコレクション要素の削除、更新、挿入
- すべてのコレクションの挿入
- を使用して、対応するオブジェクトが削除されたのと同じ順序で、すべてのエンティティが削除されます。
ISession.Delete()
(例外として、ネイティブID生成を使用しているオブジェクトは、保存時に挿入されます)。
ただし、明示的に
Flush()
セッションがADO.NETの呼び出しをいつ実行するかは全く保証されておらず、実行される順番のみが保証されています。 . しかし、NHibernate はISession.Find(..)
メソッドが古いデータを返すことはありませんし、 間違ったデータを返すこともありません。デフォルトの動作を変更し、フラッシュが発生する頻度を少なくすることも可能です。その場合
FlushMode
クラスは3つの異なるモードを定義しています:コミット時にのみフラッシュする(そしてNHibernateのITransaction
API が使用されている場合)、説明されているルーチンを使って自動的にフラッシュする、またはFlush()
が明示的に呼び出されます。最後のモードは、長く続く作業単位に有効です。ISession
を長時間開いたままにしておくと、接続が切れる。
...
も参照してください。 このセクション :
セッションの終了には、4つの明確な段階があります。
- セッションをフラッシュする
- トランザクションをコミットする
- セッションを閉じる
- 例外処理
セッションをフラッシュする
を使用している場合は
ITransaction
APIでは、このステップを気にする必要はありません。トランザクションがコミットされるときに暗黙のうちに実行されます。そうでない場合はISession.Flush()
を使用して、すべての変更がデータベースと同期されることを確認します。データベーストランザクションのコミット
NHibernate ITransaction APIを使用している場合、以下のようになります。
tx.Commit(); // flush the session and commit the transaction
ADO.NETのトランザクションを自分で管理する場合は、手動で
Commit()
ADO.NETトランザクションを実行します。sess.Flush(); currentTransaction.Commit();
変更をコミットしないことにした場合。
tx.Rollback(); // rollback the transaction
または
currentTransaction.Rollback();
トランザクションをロールバックする場合は、NHibernate の内部状態が一貫していることを確認するために、現在のセッションを直ちに閉じて破棄する必要があります。
ISessionを閉じる
を呼び出すと
ISession.Close()
はセッションの終了を意味します。Close()の主な意味は、ADO.NET接続がセッションによって放棄されることです。tx.Commit(); sess.Close(); sess.Flush(); currentTransaction.Commit(); sess.Close();
自分で接続先を用意した場合。
Close()
はその参照を返すので、手動で閉じたりプールに戻したりすることができます。そうでない場合はClose()
はそれをプールに戻す。
関連
-
[解決済み] Marginのプロパティ順
-
[解決済み] リファレンスの追加にSystem.Web.Mvcが表示されないのはなぜですか?
-
[解決済み] 到達不能なホストに対してソケット操作を行おうとした
-
[解決済み] Nuget接続の試行に失敗しました。"Unable to load service index for source"。
-
[解決済み] .net の OOM 問題を解決する必要があります。
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] Visual Studioのコンパイルエラー "mismatch between processor architecture "を修正するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] app.configのマッピングがないアセンブリのapp.configの再マッピングを考慮する。
-
[解決済み] VB.NETでプログラムパスを取得する?
-
[解決済み] COMExceptionエラー80040154を修復する方法は?
-
[解決済み] .net 4.5アップグレード後、System.Web.Httpが見つからない
-
[解決済み] Visual Studioの "ターゲットフレームワーク "が見つからない
-
[解決済み] Microsoft.NETFrameworkとMicrosoft.NETFramework64の違いは何ですか?
-
[解決済み] gacutil.exeはどこですか?
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersionの違いは何ですか?
-
[解決済み] Visual Studioのコンパイルエラー "mismatch between processor architecture "を修正するにはどうしたらいいですか?