この記事では、Hibernateフレームワークのキャッシュ技術について説明します。次のように、参照のために共有してください。
Hibernateフレームワークのキャッシュは、レベル1キャッシュとレベル2キャッシュとも呼ばれるセッションキャッシュとセッションファクターキャッシュに分割されます。
レベル1キャッシュ:
レベル1キャッシュはセッションレベルのキャッシュであり、ライフサイクルが短く、セッションに対応し、冬眠によって管理され、トランザクション全体のキャッシュです。プログラムがセッションload()メソッドを呼び出すと、get()メソッド、save()メソッド、saveorupdate()メソッド、update()メソッドまたはクエリインターフェイスメソッド、hibernateはエンティティオブジェクトをキャッシュします。 Entityオブジェクトがload()メソッドまたはget()メソッドを介してクエリされている場合、hibernateはキャッシュで最初にクエリします。エンティティオブジェクトが見つからない場合にのみ、HibernateはSQLステートメントをデータベースにクエリするために発行し、それによりHibernateの使用の効率を改善します。
例えば:
パッケージcom.xqh.util; import org.hibernate.session; Import com.xqh.model.user; public static void main(string [] args){session session = null; try {session = hibernateutil.getsession(); // sessionssion.begintransaction()を取得します。 //トランザクションSystem.out.println( "first query:");ユーザーユーザー=(user)session.get(user.class、new integer(1)); system.out.println( "username:" + user.getname()); system.out.println( "2番目のクエリ:"); user user1 =(user)session.get(user.class、1); system.out.out.out.out.out.out.out.out.out.out.out. user1.getname()); session.getTransaction()プログラムが最初にget()メソッドを介してユーザーオブジェクトをチェックすると、hibernateはsqlステートメントを発行してクエリします。この時点で、Hibernateはユーザーオブジェクトで第1レベルのキャッシュを実行します。 get()メソッドを再度照会すると、ユーザー名が最初のレベルのキャッシュに存在するため、hibernateはSQLステートメントを発行しません。プログラムの実行結果:
最初のクエリ:hibernate:selectuser0_.id as id0_0_、user0.name as name0_0_、user0.sex as sex0_0_ fromtb_user_info user0_.id =?username:xqhsecond query:username:xqhh
注:第1レベルのキャッシュのライフサイクルはセッションに対応しており、セッション間で共有されません。さまざまなセッションでは、他のセッションでキャッシュされたエンティティオブジェクトを取得できません。
レベル2キャッシュ:
セカンドレベルのキャッシュはSessionFactoryレベルのキャッシュであり、そのライフサイクルはSessionFactoryと一致しています。セカンダリキャッシュは複数のセッション間で共有でき、プロセス全体またはクラスター全体のキャッシュです。
レベル2キャッシュはプラグ可能なキャッシュプラグインであり、その使用にはサードパーティキャッシュ製品のサポートが必要です。 Hibernate Frameworkでは、セカンダリキャッシュの使用ポリシーがHibernate構成ファイルを介して構成されています。
1.キャッシュ構成ファイルehcache.xmlを追加します
<ehcache> <! - キャッシュ.dataファイルが作成されるディレクトリへのパスを設定します。パスがJavaシステムプロパティである場合、実行中のVの値に置き換えられています。次のプロパティは翻訳されています。 path = "java.io.tmpdir"/> <! - デフォルトのキャッシュ構成。これらは、CacheManagerを通じてプログラムされたキャッシュに適用されます。次の属性はDefaultCacheに必要です:MaxinMemory -MemoryTernalで作成されるオブジェクトの最大数を設定します - 要素が永遠かどうかを設定します。永遠の場合、タイムアウトが無視され、Elementisが期限切れになることはありません。TimetoidLeseConds-は、有効期限が切れる前に要素をアイドル状態にする時間を設定します。要素が永遠ではない場合にのみ使用されます。アイドル時間は、最終アクセスされたタイムティメトリブセカンドであり、有効期限が切れる前に要素のために生きる時間を設定します。要素が永遠ではない場合にのみ使用されます。 TTLは現在 - 作成TimeFlowtodisk-Inメモリのキャシハがマキシンメモリーの制限に達したときに要素がディスクにオーバーフローできるかどうかを設定します。-> <DefaultCachemaxelementsInmemory = "10000" ETERNAL = "FALS" TIMETOIDLESECONDS = "120" TIMETOLIVESCONDS = "TEMETORISECONDS ="ここにキャッシュ構成の設定を追加します。キャッシュの構成がない場合は、デフォルトキャッシュに次の属性を開始するときに警告が発行されます:名前 - キャッシュの名前を設定します。これは、キャッシュを識別するために使用されます。それは一意でなければなりません。MaxinMemory-メモリテルナルで作成されるオブジェクトの最大数を設定します - 要素が永遠かどうかを設定します。永遠の場合、タイムアウトが無視され、Elementisが期限切れになることはありません。TimetoidLeseConds-は、有効期限が切れる前に要素をアイドル状態にする時間を設定します。要素が永遠ではない場合にのみ使用されます。アイドル時間は、最終アクセスされたタイムティメトリブセカンドであり、有効期限が切れる前に要素のために生きる時間を設定します。要素が永遠ではない場合にのみ使用されます。 TTLは現在 - 作成タイムオーバーフロートディスク - メモリのキャシハがマキシンメモリの制限に達したときに要素がディスクにオーバーフローできるかどうかを設定します。--> <! - samplecache1isキャッシュという名前のサンプルキャッシュは、10000要素を記憶して最大に含まれています。この構成では、java.io.tmpがシステム上で定義されている場所に移動します。標準のLinuxシステムでは /tmp " - > <cache name =" samplecache1 "maxelementsinmemory =" 10000 "eterinal =" false "TimetoidLeseConds =" 600 "Overflowtodisk =" true " /> <!有効期限 - > <cache name = "samplecache2" maxelementsinmemory = "erternal =" true "timetoidLeseconds =" 0 "timetoliveseconds =" 0 "overflowtodisk =" false "/> - > <!
2. Hibernate構成ファイルを設定します。
<! - レベル2キャッシュを有効にする - > <プロパティ名= "hibernate.cache.use_second_level_cache"> true </property> <! - cache cache product provider-> <property name.cache.provider_class "> org.hibernate.cache.cache.ehcacheprovider <キャッシュ---> <class-cache usage = "read-only"> </class-cache>
例:
パッケージcom.xqh.util; Import org.hibernate.session; import com.xqh.model.user; public class test {public static void main(string [] args){session session = null; // first Sessiontry {session = hibernateutil.getsession(); session.begintransaction(); system.out.println( "first query:"); user user =(user)session(user.class、1); system.out.println( "user name:" + user.getname() {e.printstacktrace(); //エラーはトランザクションsession.getTransaction()。lollback();}最後に{// close hibernateutil.closessess(session);} try {session = hibernateutil.getsession(); // 2番目のcache session.begintransaction(); system.out.println( "2番目のquery:"); user user =(user.class、1); system.out.println( "username:" + user.getName(); session.getTransaction();} catch(expert e);} catch(espert e)catch();トランザクションsession.getTransaction()。rollback();}最後に{//セッションオブジェクトを閉じるhibernateutil.closessess(session);}}}}セカンダリキャッシュはセッション間で共有されるため、同じオブジェクトを異なるセッションでロードできます。 Hibernateは1つのSQLステートメントのみを発行します。オブジェクトが2度目にロードされると、Hibernateはこのオブジェクトをキャッシュから取得します。
プログラムの結果:
最初のクエリ:hibernate:selectuser0_.id as id0_0_、user0.name as name0_0_、user0.sex as sex0_0_ fromtb_user_info user0_.id =?username:xqhsecond query:username:xqhh
L2キャッシュの場合、いくつかの頻繁に更新されたデータまたは参照データを使用でき、現時点ではそのパフォーマンスが大幅に改善されます。ただし、頻繁に変更されたデータがL2キャッシュに使用される場合、パフォーマンスは特定の問題を引き起こします。
この記事の説明が、Hibernate Frameworkに基づいた全員のJavaプログラミングに役立つことを願っています。