ホームページ >Java >&#&チュートリアル >Hibernate キャッシュ メカニズムの概要

Hibernate キャッシュ メカニズムの概要

巴扎黑
巴扎黑オリジナル
2017-07-17 17:52:491847ブラウズ

休止状態の 1 レベル キャッシュ

1. Hibernate の 1 レベル キャッシュは、「セッション キャッシュ」および「セッション レベル キャッシュ」とも呼ばれます。

2. セッションを通じてデータベースからエンティティをクエリすると、次回同じエンティティをクエリすると、エンティティはデータベースから取得されるのではなく、メモリから取得されます。

3. 一次キャッシュのライフサイクルはセッションと同じです。セッションが破棄されると、セッションも破棄されます。

4. 1次キャッシュ内のデータの適用範囲は現在のセッション内です。

why (Hibernate キャッシュを使用する理由)

Hibernate は、物理データベースに頻繁にアクセスする永続層フレームワークです。

物理データソースへのアプリケーションのアクセス頻度を減らし、それによってアプリケーションの動作パフォーマンスを向上させるため。

キャッシュ内のデータは、物理データ ソース内のデータのコピーです。アプリケーションは、実行時にキャッシュからデータを読み取り、書き込みます。キャッシュ内のデータと物理データ ソースは、 synchronized


何 (Hibernate キャッシュの原理とは何ですか?) Hibernate キャッシュには、Hibernate の 1 次キャッシュと Hibernate 2 次キャッシュという 2 つの主要なカテゴリが含まれています。

1.Hibernate の 1 次キャッシュは「セッション キャッシュ」とも呼ばれます。

組み込みのセッションはアンロードできず、セッション キャッシュはトランザクション全体のキャッシュです (セッション オブジェクトのライフ サイクルは通常、データベース トランザクションまたはアプリケーション トランザクションに対応します)。

一次キャッシュでは、永続クラスの各インスタンスは一意の OID を持ちます。


2.Hibernate の 2 次キャッシュは「SessionFactory キャッシュ」とも呼ばれます。

SessionFactory オブジェクトのライフサイクルはアプリケーションのプロセス全体に対応するため、Hibernate の 2 次キャッシュはプロセス全体またはクラスター全体のキャッシュであるため、同時実行の問題が発生する可能性があるため、適切な同時アクセス戦略を採用する必要があります。この戦略はキャッシュされます。データはトランザクション分離レベルを提供します。

第 2 レベルのキャッシュはオプションであり、設定可能なプラグインです。SessionFactory はデフォルトではこのプラグインを有効にしません。

Hibernate は、キャッシュ プラグインと Hibernate の間のアダプターとして機能する org.hibernate.cache.CacheProvider インターフェイスを提供します。

2次キャッシュに保存するのに適しているのはどのようなデータですか?
1) めったに変更されないデータ
2) あまり重要ではないが、時折同時データが許可されるデータ
3) 同時にアクセスされないデータ
4) 定数データ
2 次キャッシュへの保存には適さないデータ?
1) 頻繁に変更されるデータ
2) 財務データなどの同時アクセスが決して許可されていないデータへのアクセスは絶対に許可されません
3) 他のアプリケーションと共有されるデータ。


一次キャッシュを管理するための API

1.evict()。セッションの一次キャッシュからオブジェクトをクリアするために使用されます。

2.clear()、一次キャッシュ内のすべてのオブジェクトをクリアするために使用されます。

Qurey.list() および Qurey.iterate()

1.Qurey.list() は、一次キャッシュから検索せずにデータをクエリし、SQL ステートメントをデータベースに直接送信し、クエリはオブジェクトがキャッシュに残ります。

2.Qurey.iterate() は、一次キャッシュから検索するのではなく、SQL をデータベースに直接送信して ID を照会します。オブジェクトの他の属性を使用する必要がある場合、オブジェクトは最初に検索されます。そうでない場合は、SQL クエリがデータベースに送信されるため、このメソッドだけを使用してクエリを実行すると、N+1 の問題が発生します (つまり、情報をクエリするために N+1 ステートメントをデータベースに送信することになります)。 N 個のオブジェクト)

3. そのような必要がある場合: 2 つの異なるセッションで必要です。同じオブジェクトにアクセスするには、Qurey.list() を介して 2 つ以上の SQL ステートメントを送信する必要があります。 2 番目のレベルのキャッシュ、Query.list() は最初のセッションで使用され、2 番目のセッションでは直接使用されます。 1. hibernate.cfg.xml に構成を追加します

        <!-- 开启二级缓存 --><property name="hibernate.cache.use_second_level_cache">true</property><!-- 二级缓存的提供类 在hibernate4.0版本以后我们都是配置这个属性来指定二级缓存的提供类--><property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><!-- 二级缓存配置文件的位置 --><property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>

2. ehcache.xml の構成の詳細については、3 を参照して、アノテーションを使用してエンティティを構成し、クラスの前

共通の CacheConcurrencyStrategy 属性値は、READ_ONLY (エンティティに対応するテーブル データは読み取り専用でキャッシュされる) と READ-WIRTE (テーブル データは読み取りまたは更新可能) です

4.注: Hibernate の 2 番目のキャッシュはオブジェクト全体である必要があります。オブジェクトの一部の属性のみがクエリされる場合、オブジェクトはキャッシュされません


クエリ キャッシュ (SessionFactory レベルのキャッシュ)

1 に進みます。上記の 2 次キャッシュに基づいて設定します

2. hibernate.cfg.xml に設定を追加します

  <property name="hibernate.cache.use_query_cache">true</property>

2. エンティティ アノテーションに @Cacheable を追加します

3. HQL ステートメントの後に setCacheable(true) メソッドを呼び出します

4. HQL クエリ ステートメントがまったく同じである場合にのみ、パラメーター設定も同じである必要があります。クエリキャッシュは有効です

休止状態の 3 つの状態 (transient (一時状態)、persistent (永続状態)、および Dettached (オフライン状態))


以上がHibernate キャッシュ メカニズムの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。