2

hibernate がセッションを閉じるとき、close の目的は基本的に、基礎となる接続を閉じて、第 1 レベルのキャッシュをクリーンアップすることです。ここでフラッシュも自動的に行われないのはなぜですか?

4

1 に答える 1

7

トランザクションの観点から見ると、フラッシュセッションを閉じることとは大きく異なりflush、トランザクションの境界内で (またはcommit時間内に)発生する必要があります。

通常、セッションの終了には、次の 4 つの段階があります。

  • セッションをフラッシュする
  • トランザクションをコミットする
  • セッションを閉じる
  • 例外を処理する

一方、セッション (および基礎となる接続) を閉じることは、トランザクションが終了した後に行う必要があります (接続を閉じるときの保留中のトランザクションの動作は 未定義です)。

したがって、終了時に何かを行ったり、悪いセマンティクスを促進したりする理由はなく、個別の操作を行うことは完全に理にかなっています。

総括する:

  1. 想定どおりにトランザクションと適切な境界設定を使用するだけです(FlushModeに応じて、必要に応じてコミット時にセッションがフラッシュされます)。
  2. 使用するSessionFactory#getCurrentSession()と、自分で行う必要はありませんSession#close()( はSessionコミット時に閉じられます)。
于 2009-12-28T12:23:09.297 に答える