この動作は、使用中のCurrentSessionContextの実装によって決まります。デフォルトはThreadLocalSessionContextであり、クローズ・オン・コミットしますが、決してそれに制約されません。
ManagedSessionContextを使用して、任意のタイプのセッションスコープを構成/構築することができ、適切なライフサイクルの開始時と終了時にセッションをバインド/バインド解除できます。あなたのサービスの作業ユニットへのエントリでセッションをバインドし、終了時にバインドを解除することはあなたにとって意味があるようです。 (例外はその方法の一つから出てくる場合は特に、あなたが新しいSession
を作るために期待していることを覚えておいてください。もちろん、これを行うための堅牢なコードをビルドするための簡単な作業ではありません。)
コメントへの対応しますコメントにはあまりにも大きくなっていた。
これは、ユーザーが提供する追加の作業や設定なしに「安全」なのは、これが唯一のものだからです。 Hibernateが助けてくれないとHibernateが "見る"ことができる唯一のライフサイクルポイントは "コミット"だけなので、そこに閉じたり、セッションが永遠にぶら下がってしまうリスクがあります。
潜在的なセッションライフサイクルの境界を特定するには、実際に行っていることについてかなりの知識が必要です。 "それはバックグラウンドサービスです"とは言いません。アイドル状態で座ったり、X分ごとに目を覚ましたり、いくつかの作業をしたり、別のX分寝る前に戻ったりすると、セッションを終了してセッションを終了するのがよい境界になると仮定すると、
「セッションごとの操作」がアンチパターンであると話す場合、「操作」の広範な定義を使用している可能性があります。
彼ら(あなたのサービスのための架空の要件)のような何かをしません意味:
- モーニングコールサービス
- オープンセッション
データベースから
- 読むファイルの場所
- 閉じるセッション
- をファイルを開く
- 公開セッション
- 更新データ現在のファイルの状態からテーブル
- 閉じるセッション
- オープンセッション
- ASE 1であることを行うには完全に合理的であるデータベース
- 閉じるセッション
- スリープサービス
にアクティビティログを書きますセッションを終了し、最後に閉じます。既知の境界内ですべてを自分で管理しているシングルスレッド環境では、必要に応じてcurrentSession
を使わずに自分でセッションを開いたり閉じることができます。例外が発生した場合に閉じられることを確認するだけです。オペレーティングシステムイベントをリスンしている場合、イベント処理はセッションの完璧な範囲になります。
デーモンの意味で「サービス」を意味するのか、Web以外の何らかの方法でちょうどやり取りしている外部の消費者に公開される「サービス」を意味しますか? – Affe
私はデーモンの意味で「サービス」を意味します、申し訳ありませんが、それを明確にしておくべきです。 – joscarsson