hibernateキャッシュ(cache)-いくつかの収穫


キャッシュとはなんですか?なぜキャッシュを使うのか?これらの問題はもう説明しません。
 
  直接本題に入ります。ヒベルナトは一級キャッシュと二級キャッシュに分けられます。ここでは主に二級キャッシュと言います。
 
  設定からsrcを作成するファイル名は、ehcache.xmlです。
 
<ehcache>



    <diskStore path="java.io.tmpdir"/>





    <defaultCache

        maxElementsInMemory="10000"

        eternal="false"

        overflowToDisk="true"

        timeToIdleSeconds="7200"

        timeToLiveSeconds="3600"

        diskPersistent="false"

        diskExpiryThreadIntervalSeconds="120"

        />


        

</ehcache>
 
ヒベルナツ.cfg.xmlに加えます。
 
<property name=「cache.provider uclass」>org.hibernate.cache.EhCacheProvider
 
<property name=「hibernate.ache.usequeryucache」true
 
hibernateでコードを調べています。リガでquery.setCachebale(true)
 
この時はすでに二級キャッシュを開いています。具体的な詳細は具体的には説明しません。これを書くのは本来の意味で二級キャッシュを合理的に使えばいいということを記録したいからです。
 
  もちろん、hibernateには二つの方法があります。リストデータはそれぞれ.iteratorと.list()です。では、いつiteratorを使ってlistを使いますか?
 
  シーン1:
 
  データベースのフォーラムのプレート情報を得て、私達は知っていて、データベースのフォーラムのプレートの情報、基本的に上半期に一回だけ変えて、しかも毎回データベースのsql文に発送して、と返します。
 
帰ってきたデータは基本的に同じです。つまりデータ情報とsql文はほとんど修正されません。この時にリスト方法を使って戻ります。
 
情報は、リストメソッドが初めて実行した時に、データベースのデータ情報を二級キャッシュに保存します。同時にあなたが送ったsql文を記録します。今度も利用してください。
 
listメソッドは同じsql文を送信します。また、データもhibernateに知られている場合に修正されたことがありません。2回目またはn回目にこの文を実行する場合には、
 
hibernateはデータベースに接続するのではなく、キャッシュにあるデータを直接返します。
 
  シーン2:
 
  フォーラムのあるプレートの最新の20の情報を得て、私達は知っていて、フォーラムの第1ページはいつも新しい発表あるいは新しい返答の招待状があることを表示すって、それでは私達はこの時listを使うことができます。
 
方法で情報を取得しますか?答えは否定です。リストの条件の一つを満たしていますが(検索条件はほとんど修正されません)、他の条件を満たしていません。データ信頼のためです。
 
頻繁に修正されています。(新規投稿や新規回答の書き込みがあります。)この時は、私たちはiteratorを使ってデータ情報を取得することを考えます。iteratorの原理はこのようになります。
 
先にステートメントを送ります。本当に送ります。select_id from table_id>nは、すべての符を獲得します。
 
条件に合うIDを二段キャッシュに入れてこのオブジェクトを探します。もし発見されたら、それを取得します。もし発見されなかったら、IDを取得するための文を送ります。
 
最新の20の情報を得るためには(前にもう一回調べましたが、今は新しいスレッドがあります)、iterator方法を使ってまずSQLステートメントを満たすためにステートメントを送ります。
 
全部のIDを確認しました。以前に一回確認したので、キャッシュにはすでに19の書き込みのキャッシュがあります。
 
がありますので、キャッシュにはまだありません。条件はID=新規投稿IDのSQL文を送信して、この新規投稿の対象を獲得します。
 
まとめ:
hibernate 2級キャッシュがオープンすると、hibernateのsessionオブジェクトを介して得られた任意のオブジェクトhibernateがキャッシュに入れられます。
 
一方、オブジェクトが修正されたり削除されたりすると、ヒベルナは当該オブジェクトを二段キャッシュから削除します。リストメソッドは一回ですべてのデータを獲得し、同時にキャッシュに入れる。
 
において、SQL文が変化していなくてもデータが変更されていない場合、リストが直接取ったキャッシュは、データベースに再接続して検索操作を行わなくてもいいです。
 
n+1これにより、すべてのデータ情報を同時にキャッシュに入れます。SQL文が変化していなくても、常にIDを取得するSQL文を送信します。そして、IDに従って検索します。
 
がない場合はSQL文を送り、対象を獲得します。iteratorは常に1つまたはn+1つのバーを送信しますが、送信されたステートメントはすべてIDによって取得されます。
 
取りますので、速度もかなり素晴らしいです。
 
もしあるところがまだ理解していないか、あるいは私が理解していないところがあれば指摘してください。ありがとうございます。