我目前正在尝试使用hibernate附带的缓存提供程序来运行hibernate.
net.sf.ehcache.hibernate.SingletonEhCacheProvider
Run Code Online (Sandbox Code Playgroud)
我在ecache.xml中启用了默认缓存和类特定缓存,该缓存在我的hibernate.cfg.xml文件中引用.定义类/映射文件特定高速缓存以处理多达20000个对象.
但是,我发现自从我在其中一个映射文件上打开缓存映射后,我没有看到这个问题.
我的测试如下.
加载我测试的特定映射文件的10000个对象(这应该击中DB并成为瓶颈).接下来我将加载相同的10000个对象,因为我希望缓存被击中并看到显着的性能提升.尝试过使用hibernate映射xml文件中的"只读"和"读写"缓存映射.
我想知道他们需要做些什么来确保缓存在加载对象时在数据库之前被击中?
注意作为测试im pagin的一部分通过这些10000记录使用类似于下面的东西(在时间分页1000条记录).
Criteria crit = HibernateUtil.getSession() .createCriteria( persistentClass );
crit.setFirstResult(startIndex);
crit.setFetchSize(fetchSize);
return crit.list();
Run Code Online (Sandbox Code Playgroud)
已经看到标准有一个缓存模式setter(setCacheMode())所以我应该做些什么?
我注意到在内存中使用了以下的统计代码,即10000个对象(好的hiberante脱水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());
Run Code Online (Sandbox Code Playgroud)