この記事では、冬眠遅延負荷の原則と実装方法について説明します。次のように、参照のために共有してください。
Hibernateのパフォーマンスをさらに最適化するには、以下を使用できます。
レイテンシローディングテクノロジー、データクロール戦略の管理、および冬眠のパフォーマンスを改善するためのキャッシュ管理の実行。
1。読み込み遅延(負荷)
Lazy Loadingは、プログラムの実行効率を改善するためにHibernateが提供するメカニズムです。つまり、オブジェクトのデータが実際に使用される場合にのみ作成されます。
怠zyな負荷のプロセス:遅延荷重は、プロキシメカニズムを通じて達成されます。 Hibernateがデータベースから特定のオブジェクトからデータを取得し、オブジェクトのコレクション属性値を取得するとき、またはオブジェクトに関連付けられた別のオブジェクトを取得するとき、オブジェクトのデータは使用されないため(識別子を除く)、Hibernateはデータベースから実際のデータをロードしませんが、オブジェクトを表すオブジェクトのプロキシオブジェクトを作成するだけです。このオブジェクト上のすべての属性はデフォルト値です。この実際のオブジェクトは、オブジェクトのデータを実際に使用する必要があり、そのデータが実際にデータベースからロードされた場合にのみ作成されます。
セッションのLoad()メソッドがエンティティをロードするために呼び出された場合。セッションがエンティティをロードすると、エンティティ内のコレクション属性値は遅延荷重でロードされます。セッションがエンティティ、エンティティがシングルエンドであるという他のエンティティオブジェクトをロードすると、遅延荷重はシングルエンドに関連付けられた別のエンティティオブジェクトに使用されます
Lazy Loadingをオフにします:単一のエンティティをロードするときは、get()メソッドを使用できます。
エンティティのコレクション属性の場合、このセット(<set>、<bag>、<list>…)に属性lazy = "false"を追加できます。別のエンティティオブジェクトのシングルエンドアソシエーションを設定すると、マッピングファイルに属性lazy = "false"を追加するように<1-one>、<many-one>を構成できます。
2。怠zyなロードの主なタイプは、デフォルトで冬眠で使用されます。
•セッションのLoad()メソッドがエンティティをロードするために呼び出されると、レイジーロードが使用されます。
•セッションがエンティティをロードすると、このエンティティのコレクション属性値に遅延がロードされます。 (1対多)
•セッションがエンティティをロードすると、エンティティに関連付けられているシングルエンド(1対1、多目的)の別のエンティティオブジェクトが怠zyなロードされます。
•2番目と3番目の違いは次のとおりです。2番目のケースでは、遅延ロードをキャンセルする方法は、セット属性を持つ1つのパーティのマッピングファイルのセットタグの後に、Lazyロード属性= "False"を設定することです。 3番目のケースでは、多額のパーティのマッピングファイルの多目的タグ、つまり、多くのタグが設定されています。
怠zyなロードできるオブジェクトは、すべて書き直されたプロキシオブジェクトです。関連するセッションが閉じられていない場合、これらの怠zyなロードされたオブジェクト(Proxy)(GetIDおよびGetClassを除く)のプロパティにアクセスすると、Hibernateはこれらのプロキシを初期化するか、hibernate.Initialize(プロキシ)を使用してプロキシオブジェクトを初期化します。関連するセッションが閉じられると、怠zyなロードされたオブジェクトにアクセスするための例外が発生します。
3。クロール戦略(フェッチ)
セッションのget()およびload()メソッドのクエリ効果に直接影響するように「クロールポリシー」を構成します。
シングルエンドアソシエーションに関するクロール戦略<多>> <one-one>:
シングルエンドの関連マッピング要素にフェッチ属性を追加できます。選択:読み込み遅延。参加:同じ選択ステートメントで接続内の接続を使用して、オブジェクトのデータと関連するオブジェクトのデータを取得します。この時点で、関連するオブジェクトの遅延荷重は無効です。
収集プロパティに関するクロール戦略:
選択:読み込み遅延。参加:同じSelectステートメントでIntra-veiningを使用して、相手の協会セットを取得します。この時点で、関連するセットの怠zyは無効になります。 SubSelect:別のクエリステートメントまたはサブクエリを送信してクロールします。この戦略は、HQLクエリでも機能します。
4。怠zyなロードケース分析
ケース1:単一のエンティティがload()メソッドを呼び出して、怠zyな読み込みをキャンセルします
パッケージcom.hbsi.test; import org.hibernate.session; import org.junit.test; import com.hbsi.domain.user; Import com.utils.hibernateutil; publicclass testlazy {// test get()method; hibernateutil.getSession(); user user =(usel)session.get(user.class、1); // system.out.println(user.getname()); hibernateutil.close(); //ここに注:セッションが閉じていて、ユーザーが管理された状態であっても、ユーザーオブジェクトはまだ使用できます。これは、管理された状態にありますが、このオブジェクトは属性値を持つオブジェクトであり、削除されないが、データベースを扱うためにチャネルのみを分離するためです。 System.out.println(user.getName());} // testload()method; sqlステートメントを実行せず、@testpublicvoid testload(){session session = hibernateutil.getSession(); user user =(user)session.load(user.class、1); //出力IDはSQLステートメントを実行しません。上記で渡したIDからIDを直接取得します。データベースから検索されないため、SQLステートメントSystem.out.println(user.getId()); //出力名は異なります。この時点で、プロキシオブジェクトは実際にインスタンス化されています。これは、名前属性を持つプロキシオブジェクトです。現時点では、セッションを閉じたとしても、このオブジェクトを介して名前を取得できます。この文、つまり、プロキシオブジェクトはプロキシオブジェクトをインスタンス化してから、セッションを閉じた後に出力名属性を実行することはありません。エラーが報告されます:proxy // system.out.println(user.getName()); hibernateutil.close(); system.out.out.println(user.getname();}};状況2:セットで怠zyな読み込みをキャンセルします
テストコレクション属性の怠load負荷がマッピングファイルでfalseに設定されている場合、注文テーブルのデータ、つまり2つの選択ステートメントとまとめられます
@testpublicvoid find(){session session = hibernateutil.getsession(); customer cus =(customer)session.get(customer.class、3); system.out.println(cus.getcname());怠zyな読み込みを使用すると、2つのSQLステートメントが最初に出力され、出力結果は//ここでは、cus.getord()。 cus.getord()set set set set set <dorders> andors = cus.getord(); system.err.println(orders.size()); hibernateutil.close();}方法3:<1対1>、<多>対象>怠zyなロードをキャンセルします
@testpublicvoid find(){//デフォルトでは、怠zyな読み込み、つまりSQLステートメントを使用して出力します。遅延荷重がfalsに設定され、2つのSQLステートメントが出力されると、不要な顧客情報が見つかります。セッションセッション= hibernateutil.getSession(); orders ord =(orders)session.get(orders.class、3); system.out.println(ord.getoname()); hibernateutil.close();}この記事の説明が、Hibernate Frameworkに基づいた全員のJavaプログラミングに役立つことを願っています。