【发布时间】:2011-03-09 17:21:41
【问题描述】:
我目前正在尝试使用 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());
【问题讨论】:
标签: java hibernate orm caching second-level-cache