ヒベルナ学習の第14編


ヒベルナの内部キャッシュヒベルナのキャッシュは、2段階に分けられます。1級キャッシュと2級キャッシュ(session Factoryレベル)キャッシュの役割は主にパフォーマンスを向上させるためのもので、1つのMapとして簡単に理解できます。キャッシュは3つの操作に関連します。データをキャッシュに入れ、キャッシュからデータを取得し、キャッシュの無効データを削除します。1つのキャッシュ、Sessionレベルは共有します。save、udate、saveOrUpdate、load、get、list、iterate、lockなどの方法はいずれも対象をキャッシュに入れます。一次キャッシュはキャッシュの数を制御できませんので、大量のデータを操作するとメモリがオーバーフローする恐れがあります。evictを使って、clear方法でキャッシュの内容をクリアすることができます。
Person p = (Person)s.get(Person.class, id);
Person p = (Person)s.get(Person.class, id);
 この文を2回連続して実行します。sql文のselectクエリは1文だけ出力されます。一度のクエリはキャッシュにデータを取るということを説明します。
queryはキャッシュからデータを取ることができません。キャッシュからデータを取る方法は多くありません。データをキャッシュに入れる方法はたくさんあります。
static void query(int id) {
        Session s = HibernateUtil.getSession();
        Transaction tx = s.beginTransaction();
        Worker worker = (Worker) s.get(Person.class, id);
        Worker worker2 = (Worker) s.get(Worker.class, id);
        tx.commit();
        System.out.println(worker.getWork_year());
    }
 
以上のコードを実行し、sql文は以下の通りです。
Hbername:select person 0_.idas id 8_,person 0_.name as name 8_0_,person 0_.age as age 8_0_,person 0_.work uyear ask 1_.com,person 0私は、アジ、name、null asfarmmuname、0 as clazz_from person union selectwork year、id、age、name、null as farmmune、1 as clazz from from from from commwounununununion seselect、workworkworkworkworkworkwork、id、id、id、id、id、id、id、id、frarararame、frame、frame、frame、frame、frame、frame、frame、frame、frame、1 ase、frame、frame、frame、1 ase e、u where person 0_.id=?
 
s.getを2回実行しました。ただし、1つのselect文のみが、2回目はキャッシュから抽出したデータであることを説明しています。sessionのevictメソッドは、対応するキャッシュオブジェクトを消去するために使用されます。sessionのclear方法はsessionキャッシュ全体をクリアします。1級キャッシュの欠陥:キャッシュ中のデータ量に制限はありません。データ量が蓄積され、メモリオーバーフローが発生します。保護がなく、共有範囲が小さいです。一時的に保存されています。一般的には一回の要求に存在します。セカンダリキャッシュ、session Factoryクラス共有hibernateの二段キャッシュは第三者のキャッシュフレームに渡して処理します。hibernateの二段キャッシュを開いて、hibernameプロファイルに配置されます。しかし、デフォルトでは二段目のバッファは開いています。>trueは挿抜可能に実現され、cache.provider uclassパラメータを修正することによって変更されます。キャッシュプロバイダの構成は、一般的に第三者キャッシュフレームです。              ....... hibernateはEhCache、OScache、TreeCache、SwarmCacheに対するサポートを内蔵しています。Cacheco ProviderとCacheインターフェースを実現することによって、Hbernateがサポートしていないキャッシュに参加することで実現できます。  public class Main{static User query}        User user=null        セッションセッション=null        try{            session=Hibenature Util.get Session()            Transation tx=session.begintTransation()            user=(User)session.get(User.class,id)            System.out.println(user.getsUserName);            user=(User)session.get(User.class,id)            tx.com mmit()            session.clear()        } finally{            if(session!=null){                session.close()            }         }         Session s=null        try{            s=Hbernature Util.get Session()            Transation txn=s.begintTransation()            user=(User)s.get(User.class,id)            txn.com mmit()        } finally{            if(s!=null){                s.close()            }         }         return user;    }    public static void saveUser(User user){        Session session=Hibernature Util.get Session()        Transation tx=session.begintTransation()        Name name=new Name();        name.set First Name;        name.set LastName("lastName")        user.setsUserName;        session.save;        tx.com mmit()        session.close()    }     public static void main(String[]args){        User user=new User()        user.set Birthday(new Date);        saveUser        query(1);        Statistics st=Hbernature Util.get Session Factory().get Statistics()        System.out.println("put:"+st.get SecondLevelCachePutCount");        System.out.println(「hit:」+st.get SecondLevelCacheHitCount();        System.out.println("miss:"+st.get SecondLevelCachemissCount();        System.out.println(st.get Connect Count();    } 情報統計を使用する前に、ヒベルナプロファイルで設定します。 キャッシュを設定しないと出力sql文が印刷されます。キャッシュを設定しましたが、調べられませんでした。select文もありません。sql文は、ハイバーナ:insert into userです。ヒベルナート.Name@12a55aaput:1 hit:2 miss:0その後、userのキー生成方式をnative(最初に使用したhilo)出力のsql文に変更しました。Hbernate:insert into user(first mune,lastuame,birthday)values(?、?)Hbername:select user 0_.idas id 0_,user 0_.first-as first 2_0_,user 0_.lastas 3_0_,user 0_.birthday-0 birthday 0輛?Name@e0cc23put:1 hit:1 miss:1,3回の結果が違います。これはメインキーの生成方式と関係があります。分析:sessionのsave(この方法はnative生成方式のキーには適していません)nativeのマスターキー生成方式では、プログラムにオブジェクトを保存した場合は、2級キャッシュにデータを入れていません。hibernateはデータを検索する際に、まずsessionにおいて、つまり1級キャッシュで検索します。もし見つけられなかったら、返します。見つけられなかったら、1つの接続を数まで確立します。ライブラリで検索します。最初の検索では、両方のキャッシュにはないので、一度はミスがあります。接続を介してデータを取得する場合は、1級と2級のいずれかにキャッシュデータがあります。だから、put:1を印刷して、sessionをオフにしたら、1級のキャッシュはなくなりました。1級のキャッシュに該当するデータはありませんが、最終的には2級のキャッシュに使えます。データを取得したので、一回の命中になりましたので、hit:1をプリントしました。高低キーを使ったメインキーの生成方式は、saveの時に、データをキャッシュに入れます。だから一回のputがあります。毎回検索する時には、二段キャッシュでデータが見つけられます。だから、二回命中して、hit:2、miss:0を印刷しました。結果も接続の回数が表示されます。3回のために、私達のプログラムで3回のセッションを獲得しました。まとめ:sessionのsave(この方法はnative生成方式に適合していないメインキー)udate、saveOrUpdate、list、iterator、get、load及びQuery、Criteriaは二級キャッシュを充填しますが、(クエリキャッシュを開けていない時)Sessionのiteratorだけがキャッシュされます。(iteratorはN+1回のクエリが存在する可能性があります。Query、Criteria(クエリキャッシュ)は命中率が低いため、検索文と同じように命中することがあります。これは一般的ではありません。だから、hibernateデフォルトはオフです。cache.usequeryucacheを変更して、trueのためにクエリの保存を開いて、query.setCachebate ableを呼び出します。を選択します。Session Factoryでは、キャッシュの内容をクリアするためにevictXXX()の方法を提供しています。統計情報は、generantematisticsを開き、session Factory.get Statistics()を利用しています。統計情報を取得します。分散キャッシュと中央キャッシュを研究する時間があります。キャッシュを使用する条件1、読み取りが修正2より大きいです。データ量はメモリ容量を超えてはいけません。データに対しては独自のコントロールが必要です。無効なデータの出現は許容できます。