View で Hibernate Open Session: 落とし穴と代替案
View で Open Session は、見かけの単純さにもかかわらず、使用には注意が必要ないくつかの欠点があります。
ビュー内のオープンセッションに関する問題
このアプローチにより軽減される可能性がありますが分離された JVM シナリオの問題点を解決するには、コストがかかります:
-
UI レンダリングの自動コミット モード: サービス層トランザクションの完了とセッション終了後、後続の UI レンダリングがトリガーされます。すべてのステートメントの自動コミットにより、過剰な I/O によりデータベースの負荷が増加します。
-
の分離の喪失懸念事項: ステートメントの生成はサービス層と UI 層の両方にまたがり、統合テストとビジネス ロジックの分離が複雑になります。
-
潜在的な N 1 クエリの問題: UI ナビゲーションは関連付けのトラバースに限定されます。関連付けが熱心でない場合、パフォーマンスの問題が悪化する可能性があります。
-
接続リース時間の増加: UI レンダリング中はデータベース接続が開いたままになる可能性があり、輻輳とトランザクション スループットの制限につながります。
代替戦略
ビューでセッションを開くという落とし穴を避けるには、次の点を考慮してください。代替手段:
-
積極的な取得: EntityManager スコープ内で必要なすべての関連付けを取得し、UI レンダリング中に遅延初期化がトリガーされないようにします。
-
フェッチ モードカスタマイズ: Hibernate の @BatchSize を使用し、すべてのビジネス シナリオに影響を与えることなく、関連付けのフェッチを最適化するために FetchMode.SUBSELECT アノテーションを賢明に追加します。
-
データ アクセス層クエリ: 特定のユースケースの特定のデータ フェッチ要件に具体的に対処するカスタマイズされたクエリを作成します。
Spring Boot 構成
春ブート、ビューでセッションを開くはデフォルトで有効になっています。これを無効にするには、application.properties 構成で次のプロパティを設定します。
spring.jpa.open-in-view=false
これにより、LazyInitializationExceptions の適切な処理が強制され、ビューでセッションを開くことに関連する望ましくない結果が回避されます。
以上がビューでセッションを開くのは正しい選択ですか?落とし穴とより良い代替案の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。