English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、hibernateの学習中にhibernateのラジー・ロード問題を解決する4つの方法をまとめました。
ラジー・ロード(lazy)とは、遅延読み込み、遅延処理のことです。
ラジー・ロードを使用するタイミングについて、私は「必要なときに使用する」としか答えられません。
データ量が多い場合、キャッシュを使用するのは適切ではありません。なぜなら、メモリ容量には限界があるからです。並行処理の量を減らし、システムリソースの消費を減らすために、データが必要なときにのみ読み込むようにし、その際にラジー・ロードを使用します。
例えば、EmployeeというオブジェクトとDepartmentというオブジェクトがあります。明らかに、EmployeeがDepartmentに対して多対一の関係であり、DepartmentがEmployeeに対して一対多の関係です。Employeeオブジェクトをクエリする場合、employeeオブジェクトの属性departmentを通じて対応するDepartmentにアクセスしようとすると、例外が発生します。これは、lazyロードの存在によるもので、セッションが閉じられた後、Hibernateがデータベースに再度リクエストを発行するためです。
以下に、この問題を解決する4つの方法をまとめました:
1.明示的な初期化(クエリメソッド内部で)
特定の従業員がどの部署に属しているかを確認する場合、Departmentを事前にクエリする必要があります
使用する文
Hibernate.initialize(Department.class);
2.オブジェクト関係ファイルを修正し、lazyをlazy=falseに書き換え、即座に読み込む(lazyロードをオフにする)
これらの方法は実際には問題を解決できますが、欠点は、そのオブジェクトが使用されるかどうかにかかわらず、HibernateがデータベースにSQL文を発行してデータをリクエストするため、不必要なパフォーマンスの浪費が発生することです。
3.フィルタ(ウェブプロジェクト)を使用
①セッションを取得する方法は、getCurrentSessionを使用する必要があります
②特殊なセッション閉じ方
public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) throws IOException, ServletException { // TODO Auto-生成されたメソッドスタブ Session session = null; Transaction tx = null; try { session = HibernateUtil.getCurrentSession(); tx = session.beginTransaction(); arg2.doFilter(request, response);//リクエストは常に進行中 tx.commit(); } catch (Exception e) { // TODO:例外を処理する if(tx != null){ tx.rollback(); } }finally{ //特殊な閉じ方 HibernateUtil.closeCurrentSession(); } }
4SSHフレームワークで、Springが提供するopenSessionView
これは第3つの方法で使用されるFilterの原理と似ていますが、このfilterはSpringが提供しています。使用するには、web.xmlファイルに以下のように設定してください:
<!-- Springを使用してラズマウト問題を解決する --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
と3と4中の方法もラズマウトの問題を解決できます。特に、4これらの方法も現在よく使用されていますが、欠点もあります。欠点はセッションの閉じる時間が延び、セッションのライフサイクルが長くなることです。この方法を使用する前に、セッションはデータのクエリが完了した後に閉じられていましたが、今はウェブリクエストの最後にセッションの閉じが行われます。
まとめ
これは本文で簡単に解決策を紹介するためのものです。4この方法のすべての内容を提供し、皆様に役立つことを願っています。興味を持たれた方は、本サイトの他の関連トピックもご参照ください。不足点があれば、お気軽にコメントしてください。皆様の本サイトへのサポートに感謝します。
声明:本文の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。また、人工編集は行われていません。著作権侵害を疑う内容がある場合は、メールを以下のアドレスに送信してください:notice#oldtoolbag.com(メール送信時、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がついたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)