休止状態のキャッシュ(転送)

Hibernateキャッシュは、値を見つけるためにキャッシュ内のマップキャッシュキーとして単純に使用できます。

まず、キャッシュ内のキャッシュをHibernateで導入する
HIBERNATEのCACHEには2つのレベルがあります。
各セッションにはCACHEがあり、オブジェクトの現在の操作はCACHEに保持されますが、CACHEセッションが終了すると、このライフサイクルは表示されません。短く(キーワード格納にIDを使用:キャッシュのキーはID、値はPOJO)(キャッシュされたエンティティオブジェクト)
他のレベルのCACHEはSessionFactoryの範囲内にあり、これは同じSessionFactoryからSessionによって共有されることが可能で、HIBERNATEのドキュメントではSECOND LEVEL CACHEと呼ばれています。 EhCache、JBossCache、OsCacheなどの異なるキャッシュ実装を使用します(2番目のレベルのキャッシュはキャッシュされたエンティティオブジェクトです)
CACHEのタイプもあります.QueryCacheの役割は、QueryとQueryの戻りオブジェクト識別子とオブジェクトのタイプをキャッシュすることです.QuickCacheを使用すると、効率的にSECOND LEVEL CACHEを使用できます。
ハイバネートクエリキャッシュ(ハイバネートデフォルトはオフ)
クエリキャッシュは、共通属性キャッシュの結果セットに対してキャッシュされ、エンティティオブジェクトIDの結果セットのみ
キャッシュのライフサイクルを照会すると、現在の関連テーブルが変更され、クエリキャッシュのライフサイクルのキャッシュ構成と使用が変更されます。
1.クエリキャッシュを有効にする:hibernate.cfg.xmlに追加する:
<property name = "hibernate.cache.use_query_cache"> true </ property>
プログラムでは、次のようなクエリキャッシュを手動で有効にする必要があります。query.setCacheable(true);
クエリーをキャッシュするために使用されるQueryCache、およびオブジェクトIdentifierおよびTypeの結果セットを照会します。キャッシュされたQueryを再度使用すると、実際のオブジェクトSECOND LEVEL CACHEオブジェクトIdentifierおよびTypeを見つけることができます。
クエリキャッシュの場合、キャッシュキーはhql sqlとパラメータ、ページングおよびその他の情報に基づいて生成されます(ログ出力を通して見ることができますが、その出力はあまり読みにくく、コードを変更することをお勧めします)。

注:キャッシュは、セッションレベルキャッシュまたはトランザクションキャッシュとも呼ばれます。 Hibernate第2レベルキャッシュは、プロセスレベルキャッシュまたはSessionFactoryレベルキャッシュとも呼ばれます。 2番目のレベルのキャッシュはグローバルキャッシュで、すべてのセッションで共有できます。 セカンドレベルのキャッシュライフサイクルとSessionFactoryの一貫したライフサイクルであるSessionFactoryは、セカンドレベルのキャッシュを管理できます。

次に、キャッシュの範囲キャッシュの範囲は3つのカテゴリに分けられます。
事業範囲
トランザクションキャッシュの範囲は、現在のトランザクションでのみアクセスすることができます、各トランザクションは、独自のキャッシュを持って、キャッシュ内のデータは通常、相互に関連したオブジェクトform.Cacheのライフサイクルは、記憶媒体としてのキャッシュメモリのトランザクション範囲の終わりのライフサイクルは、キャッシュがトランザクションの範囲に属している。
2適用の範囲
アプリケーションのキャッシュは、アプリケーションキャッシュ内のすべてのトランザクションで共有できます。キャッシュのライフサイクルはアプリケーションのライフサイクルによって異なり、キャッシュされたライフサイクルはアプリケーション終了時に終了します。アプリケーション全体のキャッシュでは、ストレージメディア、二次キャッシュはアプリケーションの範囲に属します。
3.クラスターの範囲
クラスタ環境では、キャッシュは1つ以上のマシン上のプロセスによって共有され、キャッシュ内のデータはクラスタ環境内の各プロセスノードにレプリケートされ、プロセスはテレコムを介して通信し、キャッシュ内のデータの一貫性を保証します。データは、通常、オブジェクトの緩いデータの形式です。
第3に、それぞれキャッシュする方法が4つあります。
CacheConcurrencyStrategy.NONE
CacheConcurrencyStrategy.READ_ONLY、読み取り専用モード、このモードでは、データ更新操作の場合は例外が発生します。
CacheConcurrencyStrategy.READ_WRITE、読み取りと書き込みモードは、キャッシュ内のデータがロックされ、他のトランザクションがロックされていることが判明した適切なキャッシュデータを取得するためにデータベースのクエリに直接移動するとキャッシュを更新します。
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE、厳密な読み書きモードではデータのロックがキャッシュされません。
CacheConcurrencyStrategy.TRANSACTIONAL、トランザクションモードは、トランザクションがロールバックされるときにキャッシュサポートサービスを参照し、キャッシュはロールバックでき、JTA環境のみをサポートします。

キャッシュされたコメントは、次のように記述され、Entity Javaクラスに追加されます。
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
第4に、キャッシュ管理
Hibernateキャッシュ管理レベル1キャッシュ管理:
evit(Object obj)指定された永続オブジェクトをL1キャッシュから消去し、オブジェクトが占有するメモリリソースを解放し、指定されたオブジェクトを永続状態から解放状態に変更して空きオブジェクトにします。
clear()レベル1キャッシュ内のすべての永続オブジェクトをクリアし、占有するメモリリソースを解放します。
contains(Object obj)指定されたオブジェクトがL1キャッシュに存在するかどうかを判定します。
flush()レベル1キャッシュの内容を更新して、データベースデータと同期させます。

セカンダリキャッシュ管理:
evict(Class arg0、Serializable arg1)クラスの指定されたIDの永続オブジェクトをレベル2キャッシュから消去し、オブジェクトが使用するリソースを解放します。
evictCollection(String arg0)指定されたクラスのすべての永続オブジェクトの指定されたコレクションを2次キャッシュから消去し、占有するメモリー・リソースを解放します。

どのように物理的なデータストレージの多数のメモリオーバーフローにつながるのを避けるために
*最初にフラッシュしてからクリアしてください

データ量が特に大きい場合は、jdbcを使用して、jdbcが要件を満たせない場合は、データベース固有のインポート・ツールを使用することを検討してください

第5に、どのような種類のデータが2次キャッシュに適していないのですか?
次の状況は、L2キャッシュへのロードには適していません。
1.頻繁に変更されたデータ
2.データへの同時アクセスを許可しない
3.他のアプリケーションと共有されるデータ
第2レベルのキャッシュにロードすると、次のようになります。
1.データ更新頻度が低い
2.時折の並行性の問題を許容する重要ではないデータ
3はデータへの同時アクセスではありません
定数データ
5.第三者によって変更されないデータ

6つ、2つのキャッシュ構成
Hibernateは、L2キャッシュプラグインを設定することで実装されます。Hibernateはこれらのプラグインを統合するためのorg.hibernate.cache.CacheProviderの言い回しを提供しますHibernateはキャッシュプラグインとHibernate間のアダプタとして機能します。

共通のセカンダリキャッシュプラグイン
EHCache org.hibernate.cache.EhCacheProvider
OSCache org.hibernate.cache.OSCacheProvider
SwarmCahe org.hibernate.cache.SwarmCacheProvider
JBossCache org.hibernate.cache.TreeCacheProvider

hibernate.cache.provider_classを設定します。
ここではehcacheを使います
hibernate.cache.provider_class = net.sf.hibernate.cache.EhCacheProvider
これはHIBERNATEのデフォルトのCACHEプロバイダであるため、何もする必要はありません。
単にehcache設定ファイルehcache.xmlをsrcに追加してください:
<ehcache>
<diskStore path = "java.io.tmpdir" />

<defaultCache maxElementsInMemory = "10000" eternal = "false" timeToIdleSeconds = "120" timeToLiveSeconds = "120" overflowToDisk = "true" />

<cache name = "goncha.hb.bean.Person" maxElementsInMemory = "10" eternal = "false"
timeToIdleSeconds = "100" timeToLiveSeconds = "100" overflowToDisk = "false" />
<cache name = "goncha.hb.bean.Address" maxElementsInMemory = "10" eternal = "false"
timeToIdleSeconds = "100" timeToLiveSeconds = "100" overflowToDisk = "false" />
</ ehcache>
どのメソッドがキャッシングをサポートしているか
get()
* load()
* iterate()(クエリエンティティオブジェクト)
save()
クエリキャッシュはquery.list()でのみ動作します

キャッシュテスト:
1。 負荷テスト:同じセッションで2つの負荷クエリを発行する(1)
2。 テストを取得する:同じセッションでクエリを2回発行する(1)
3。 iterateテスト:イテレータクエリ(1(id)+ N、1(id)を同じセッションで2回発行する)
4。 クエリ属性のテストを繰り返します。同じセッションクエリ属性で2回発行されます(2つのクエリの共通属性を繰り返します。キャッシュはキャッシュされず、SQLを発行します)
5。 同じセッションが最初に保存され、負荷クエリを発行してデータを保存します - 保存はキャッシュの使用です
6。 同じセッションで最初にload queryを呼び出し、sessio.clear()またはsession.evict()を実行し、load query(2)を呼び出します。
sessio.clear()またはsession.evict()はキャッシュを管理できますが、キャッシュは取り消すことはできませんが、管理できます。上記の文では、プライマリキャッシュエンティティがクリアされているためsqlが発行されます
7。 1000バッチのデータがデータベースに追加されました
//データの各セッションは、大量のデータがメモリオーバーフローを引き起こさないように、セッションを強制的にデータの永続化、キャッシュのクリアを強制します

第2レベルのキャッシュテストを開きます。
1。 開いている2つのセッションの問題を2つのロードクエリ(取得し、同じ、1を読み込む)
2。 2つのセッションをそれぞれ開き、loadを呼び出し、2番目のレベルのsessionFactory cache(2)をクリアします。
3。 第1レベルキャッシュと第2レベルキャッシュの相互作用
session.setCacheMode(CacheMode.GET); //セカンダリキャッシュから読み込むだけに設定し、セカンダリキャッシュにデータを書き込まない(2)
session.setCacheMode(CacheMode.PUT); //セカンダリキャッシュにデータを書き込むように設定し、データを読み込まない(2)

ハイバネートクエリキャッシュテストを開く:
1。 クエリキャッシュを開き、セカンダリキャッシュをオフにし、セッションをそれぞれ開き、query.list(クエリプロパティ)(1)を呼び出します。
2。 クエリキャッシュを開き、セカンダリキャッシュをオフにして、それぞれ2つのセッションを開き、query.list(クエリのプロパティ)を呼び出します。
(1回)クエリキャッシュのライフサイクルとセッションのライフサイクル
3。 クエリキャッシュを開き、セカンダリキャッシュをオフにし、それぞれ2つのセッションを開き、query.iterate(クエリプロパティ)を呼び出します。
クエリキャッシュはquery.list()でしか動作しないため、query.iterate()は機能しません。つまり、query.iterate()はクエリキャッシュを使用しません
4。 デフォルトのリストはすべてのクエリのSQLが発行されるので、クエリのキャッシュを閉じて、セカンダリキャッシュをオフにし、それぞれ2つのセッションを開き、query.list(クエリエンティティオブジェクト)
5。 2番目のキャッシュをオフにするため、2番目のキャッシュをオフにし、2番目のセッションをそれぞれ開き、query.list(クエリエンティティオブジェクト)を呼び出して2番目のデータベースをクエリし、N sql文を発行します。キャッシュが対応するエンティティに存在しない場合、それはエンティティID SQLステートメントに基づいてクエリを発行します、それ以外の場合はSQLを発行しません、クエリキャッシュは、エンティティオブジェクトIDをキャッシュします。キャッシュ内のデータを使用する
6。 クエリキャッシュを開き、セカンダリキャッシュを開き、それぞれ2つのセッションを開きます。query.list(クエリエンティティオブジェクト)を呼び出します。セカンダリキャッシュとクエリキャッシュがオンになっているため、クエリキャッシュキャッシュはエンティティオブジェクトIDリスト、Hibernateは、適切なデータを取得するために第2レベルのキャッシュに物理オブジェクトのIDリストに基づいています8つのプロジェクトの統合と使用の2つのキャッシュ
1. echcache.xmlファイルがsrcにコピーされ、セカンダリキャッシュの休止状態がデフォルトでオフになり、手動で開かれます
2オープン・セカンダリ・キャッシュ、hibernate.cfg.xmlファイルの変更、
<property name = "hibernate.cache.user_second_level_cache"> true </ property>
3.指定されたキャッシュプロダクトプロバイダ
<property name = "hibernate.cache.provider_calss"> org.hibernate.cache.EhCacheProvider </ property>
4.第2レベルのキャッシュを使用するエンティティを指定します(2つの方法、2番目の方法が推奨されます)
最初のもの:* .hbm.xmlの中で、<id>
<cache usage = "read-only" />、第2レベルのキャッシュを使用第2:hibernate.cfg.xml構成ファイルで、<mapping resource = "com / Studnet.hbm.xml" />
<class-cache class = "com.Studnet" usage = "read-only" />

要約:
あなたがそれを管理でき、条件が正しい場合にのみ、キャッシュがパフォーマンスを向上させることは当然のことではありません。 ハイバネーション・セカンダリ・キャッシュの制限は、さらに不便ですjdbcは更新のパフォーマンスを大幅に低下させる可能性があります。 誤用の原則を知らない場合、1 + Nの問題が存在する可能性があります。 不適切な使用はまた、汚れたデータを読み取る結果になる可能性があります。
休止状態の多くの制限に耐えられない場合は、アプリケーションレベルでキャッシュ上で実行してください。
より高いレベルのキャッシングでは、効果はより良くなります。 ディスクがキャッシュされているように、データベースは独自のキャッシュを実装しなければならず、データベースがキャッシュされていてもアプリケーションによってキャッシュされます。 キャッシュの下部には、これらのデータを使用するトップが分からないため、より汎用性の高いレベルのキャッシュをターゲットにすることができます。したがって、より高いレベルのキャッシュを実行すると、効果がより良くなります。

パフォーマンスの認識は、最大のパフォーマンスではなく合理的なパフォーマンスです。 妥当なのは何ですか? ユーザーは、3秒以内に頻繁に言ったような物理的なボトルネックにはならない、ビジネスプロセスの範囲内で(または敏感な)感じることができます。

投稿者:http://aumy2008.blogbus.com/logs/41093212.html

カテゴリ:Default 時間:2018-05-16 人気:1

関連記事

Copyright (C) socapnw.com, All Rights Reserved.

Socapnw All Rights Reserved.

processed in 0.245 (s). 12 q(s)