現在、休止状態に付属のキャッシングプロバイダーを使用して休止状態を機能させようとしています。
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());