我目前正在尝试使用 hibernate 附带的缓存提供程序让 hibernate 工作。
net.sf.ehcache.hibernate.SingletonEhCacheProvider
我在我的 hibernate.cfg.xml 文件中引用的 ecache.xml 中启用了默认缓存和特定于类的缓存。类/映射文件特定的缓存被定义为处理多达 20000 个对象。
但是,我没有看到任何性能提升,因为我在其中一个映射文件上打开了缓存映射,我正在使用它进行测试。
我的测试如下。
加载 10000 个特定映射文件的对象即时测试(这应该会击中数据库并成为瓶颈)。接下来我要加载相同的 10000 个对象,因为此时我希望缓存被命中并看到显着的性能提升。已尝试在我测试的休眠映射 xml 文件上同时使用“只读”和“读写”缓存映射。
我想知道他们是否需要做任何事情来确保在加载对象时缓存在数据库之前被命中?
请注意,作为测试的一部分,使用类似于下面的方法对这 10000 条记录进行分页(一次分页 1000 条记录)。
Criteria crit = HibernateUtil.getSession() .createCriteria( persistentClass );
crit.setFirstResult(startIndex);
crit.setFetchSize(fetchSize);
return crit.list();
已经看到标准有一个缓存模式设置器(setCacheMode()
)所以我应该用它做些什么吗?
我注意到使用下面的统计代码,内存中有 10000 个对象(我想象中的冬眠脱水对象??),但由于某种原因,我得到 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());