Hibernateは第2レベルのキャッシュを持つCPUの利点は、初期のヒットを上回るない場合

ポール・テイラー:

第二レベルのオブジェクトキャッシュをHibernateに追加したオブジェクトを持つCPUの利点は、初期のヒットを上回るない場合。

私は現在、第二レベルのキャッシュなしにHibernateを使用しています。これは、そのプロセスの音楽ファイル(アプリケーション用でwww.jthink.net/songkong)、それはより多くのデータを拡張することができますので、それはすなわち、それは1000曲よりも少し多くのメモリ10万曲を処理することができ、休止状態を使用しています。曲はその後、処理された後(ユーザーがアンドゥを実行しない限り)これらの曲はありません興味があります

私は(私の歌のクラスのために)第二レベルのキャッシュを有効にした場合、私はそれを理解したようだけでデータベースに書き込む場合は、キャッシュへの曲の最初の書き込みは、より多くのCPUを使用すると、曲のオブジェクトへの追加の変更はまた、より多くのCPUリソースが必要になります。しかし、Ehcacheのからの曲のその後の検索は、データベースからそれを取り出す少ないリソースが必要になります。

私の曲はフォルダでフォルダを処理し、(異なるエグゼキュー上の)ステージ数を通過している、彼らは次のエグゼキュータにキューイングされているとき、私たちはそれ以外のパラメータとして曲IDを渡し、それが歌のオブジェクトを格納するヒープメモリを大量に使用します自分自身。特定のタスクが実際に執行上で実行されたときに、それが最初に行うことは、これらのIDのために曲を取得します。

そう回数1000を取得されない特定の曲IDが存在しないが、すべての曲は、典型的に1〜4回取り出し、10倍に書き込まれます。我々は非常に小さいキャッシュを(私は近い制御の下で、ヒープメモリを維持したいので)持っていたのであれば、私は彼らの曲はキャッシュに追加さに加工された最初のいくつかのフォルダを期待し、新しいフォルダから、彼らの完全な歌として自分を取りますキャッシュに配置します。

しかし、私の質問は、それは価値があるのですか?

1:親指のルールは1-4の書き込み対10の回収のは、第二レベルのキャッシュを使用しての理にかなっている、または比率がより100のようなものである場合にのみ有効ですしたよう?

アンリ:

本当の答えは次のとおりです。ただ、ベンチマークを。

ヒープキャッシュへの書き込みはコストがかかるということではありません。そうです、でもキャッシュから一度取得することは、より速く、再度データベースへのボインようになります。

その後、キャッシュは、HashMapのの上に、主に2つのことを行います。それは追い出すと有効期限が切れます。

あなたがキャッシュに、いくつかの最大サイズを設定することを立ち退き手段。これが到達すると、キャッシュは、新しいものを追加するために「最も古い」エントリを追い出します。最古のための複数の定義があります。Ehcacheのは、サンプルの中で最も長い時間のためにアクセスされなかったエントリアウトエントリとキックの一連のオーバーサンプリングを行います。

有効期限手段が与えられたエントリは、ある時点で無効と見なされること。たとえば、あなたは1時間、データベース内の最新のものを持つエントリをリフレッシュする前に、エントリを保存しておきたいです。あなたがエントリを取得する場合、Ehcacheの最初のルックスのエントリの有効期限が切れている場合。それがある場合は、NULLを返し、キャッシュからエントリを削除します。それはあなたがそれにアクセスしようとするまで、期限切れのエントリがキャッシュ内にとどまることを意味します。

あなたのケースでは、あなたは一度エントリをロードしたいと思うでしょう。そして、キャッシュにそれを持っています。それを使用して、最終的にメモリを節約するためにそれを削除します。あなたは、あなたはもうエントリーを必要としません知っている最後のステップを持っている場合は、そこにそれを削除。

そうでない場合は、立ち退きに依存する必要があります。(あなたが期限切れのものを取り除くことができれば完全に有効なエントリを削除する理由は?)立ち退きアルゴリズムは、最初の有効期限が切れたエントリを削除しますので。

あなたは、エントリがすべてのexecutorを通過するキャッシュ内にとどまるべきか、多くの時間を計算する必要があります。これはあなたの有効期限の時間(TTL)となります。そして、あなたは、多かれ少なかれにあなたのキャッシュのサイズをNB_EXECUTORS * NB_STEPSそれから、現在では使用された曲のサイズになります。新しい曲を追加する場合、キャッシュが古いエントリを立ち退かせる必要があります。害は行われませんので、ほとんどの場合、このエントリは期限切れになります。

(期限切れのエントリを見つけていない時にコストがかかることが)立ち退きを回避するには、エントリを取得し、バックグラウンド・ルーチンをコーディングすることができます。これは、有効期限がトリガされます。しかし、再び、それは実際に高速であることを、ベンチマークを使用して、確認される前のことをしません。

最後に、あなたはそれが歌を取得するには以下の操作が必要になりますので、Hibernateのレベル2を使用するのではなく、直接歌をキャッシュする場合があります。二次キャッシュにあったエントリを書き込む際にも、Hibernateはキャッシュから追い出しする傾向があります。それがためにあなたが設定していることを確認しないでそれを行います。

変更に関する注意。デフォルトEhcacheの上のヒープキャッシュ(とのみオンヒープキャッシュ)することで、参照ごとです。あなたがキャッシュからソングオブジェクトを取得し、それを変更した場合、それは実際には1つだけのインスタンスだからだから、キャッシュ内のエントリも同様に変更されます。

しかし、それはどのようにHibernateの二次キャッシュの作品ではありません。彼らは、キャッシュ内のデータベース行のいくつかの種類を維持します。これは、ソングに変換し、あなたに返されます。

データベースにソングを保存すると、私は上に言っていたとしてHibernateがキャッシュから立ち退かされます(ただし、構成のキャッシュ更新のために頼むかもしれない、私はそれについてはよく分かりません)。

私はあなたが二次キャッシュを使用するのではなく直接キャッシュすべきだと思う理由です。あなたはHibernateがロードされたオブジェクトを取得しているためしかし、気を付けます。あなたはキャッシュにそれを置く前に、休止状態から取り外しする必要があります。そして、新しいエグゼキュータでそれを添付してください。あなたは、インスタンスのためのコレクションを持っている場合、それ以外の場合は、奇妙なことが起こる可能性があります。

さて、あなたはキャッシュとデータベースのたびに更新したいと仮定。あなたはそれを行うには2つの方法があります。

キャッシュ・脇を使用すると、キャッシュを更新、その後DBを更新します。

キャッシュスルーを使用すると、DBの更新(atomitacally)世話をするキャッシュを更新します。あなたが提供する必要があるため、キャッシュスルーはもう少し関与しているCacheLoaderWriter実装を。しかし、それは確か、キャッシュとデータベースが常に同期していることができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=181305&siteId=1