English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Hibernateの遅延ロードを解決する簡単な方法について4方法

この記事では、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(メール送信時、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がついたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)

基本教程
おすすめ