6

現在、休止状態に付属のキャッシングプロバイダーを使用して休止状態を機能させようとしています。

net.sf.ehcache.hibernate.SingletonEhCacheProvider

hibernate.cfg.xml ファイルで参照されている ecache.xml で、デフォルトのキャッシュとクラス固有のキャッシュが有効になっています。クラス/マッピング ファイル固有のキャッシュは、最大 20000 個のオブジェクトを処理するように定義されています。

ただし、これをテストしているマッピング ファイルの 1 つでキャッシュ マッピングをオンにして以来、パフォーマンスの向上は見られません。

私のテストは次のとおりです。

テスト中に特定のマッピング ファイルの 10000 個のオブジェクトをロードします (これは DB にヒットし、ボトルネックになるはずです)。次に、同じ 10000 個のオブジェクトをロードします。この時点で、キャッシュがヒットし、大幅なパフォーマンスの向上が見られると予想されます。休止状態のマッピングxmlファイルで「読み取り専用」と「読み取り/書き込み」の両方のキャッシュマッピングを使用してみましたが、テスト中です。

オブジェクトをロードするときにDBの前にキャッシュが確実にヒットするようにするために私がしなければならないことは何ですか?

テストの一部として、これらの 10000 レコードを次のような方法でページングすることに注意してください (一度に 1000 レコードをページングします)。

Criteria crit = HibernateUtil.getSession() .createCriteria( persistentClass );
       crit.setFirstResult(startIndex);
       crit.setFetchSize(fetchSize);
       return crit.list();

基準にキャッシング モード セッター ( setCacheMode()) があることがわかりました。

以下の統計コードを使用すると、メモリ内に 10000 個のオブジェクト (ハイベランテ脱水 onjects だと思いますか??) があることに気付きましたが、何らかの理由でヒット数が 0 で、さらに心配なことにミス数が 0 であるため、キャッシュにまったく移動していないように見えます統計コードがメモリ内に10000個のオブジェクトがあることを私に伝えているように見えても、ルックアップを行っているとき。

私が何をしているのかについてのアイデアはありますか?キャッシュが使用されていることを意味するため、ミスが発生するのは良いことだと思いますが、キャッシュヒットが発生しない理由がわかりません。それは、私が基準を使用setFirstResult()して使用しているという事実にかかっていますか。setFetchSize()

System.out.println("Cache Misses = " + stats.getSecondLevelCacheMissCount());
System.out.println("Cache Hits Count = " + stats.getSecondLevelCacheHitCount());

System.out.println("2nd level elements in mem "+ stats.getSecondLevelCacheStatistics("com.SomeTestEntity").getElementCountInMemory());
4

1 に答える 1

13

第 2 レベルのキャッシュは、「主キーによる検索」で機能します。他のクエリの場合、クエリをキャッシュする必要があります(クエリ キャッシュが有効になっている場合) Criteria#setCacheable(boolean)

Criteria crit = HibernateUtil.getSession().createCriteria( persistentClass );
crit.setFirstResult(startIndex);
crit.setFetchSize(fetchSize);
crit.setCachable(true); // Enable caching of this query result
return crit.list();

私は読むことをお勧めします:


クエリをキャッシュする場合、それらはすべてクエリからの休止状態のエンティティであり、2 番目のレベルのキャッシュで利用できますか?

はい、そうします。これは、私が言及したリンクで白地に黒く説明されています。第 2 レベルのキャッシュと組み合わせて使用​​されます。 」あなたはそれを読みました?

クエリ キャッシュの使用は、休止状態の第 2 レベル キャッシュの使用とはまったく異なるという印象を受けました。

違います (キャッシュ エントリに使用される「キー」が異なります)。ただし、クエリ キャッシュは L2 キャッシュに依存しています。

あなたの答えから、クエリ キャッシュと第 2 レベルのキャッシュはどちらも同じであり、キャッシュ ヒットを生成するには、「主キーによる検索」を使用する必要があることを示唆しているようです。

「主キーで検索」していないため、クエリをキャッシュする必要があると言っているだけです。はっきりしないものはわかりません。クエリまたは条件オブジェクトを呼び出そうとしましたsetCacheable(true)か? 主張して申し訳ありませんが、私が投稿したリンクを読みましたか?

于 2010-06-29T23:10:30.220 に答える