在我的Spring + Hibernate项目中为hibernate设置二级缓存时出了问题,或者我不明白它是如何工作的。
我有一个大致定义为此表的表
@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY, region="testCache")
public class TestClass extends MSId {
@Transient
STATUS statut = STATUS.NORMAL;
public FamilleCatalogue(int id) {
this.id = id;
}
}
在我的配置中,我有这个:
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.default_schema" value="dbtest" />
<property name="hibernate.cache.use_query_cache" value="false" />
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.cache.generate_statistics" value="true" />
<property name="hibernate.cache.use_structured_entries" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.use_sql_comments" value="false" />
<property name="net.sf.ehcache.configurationResourceName" value="/spring/persistence/single/hibernate/ehcache.xml"/>
<property name="hibernate.cache.use_reference_entries" value="true"/>
我的ehcache.xml包含:
<cache
name="testCache"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600"
statistics="true"
logging="true"
maxElementsInMemory="100">
</cache>
现在,在我的测试中,我使用以下方法查询测试类的所有元素:
Query q = this.getEntityManager().createQuery("FROM " + entityClass.getSimpleName());
List<E> result = q.getResultList();
return result;
问题是我查询了2次,他们期望第二次生成的对象将从第二级缓存而不是数据库中的直接查询。但是,每次启动查询时,都会从数据库中检索所有实体并将其放入缓存中,如下面的跟踪所示:
======> Query all test objects (1)
--> Entity Load Count : 297
--> 2nd Level Hits : 1
--> 2nd Level Misses : 1
--> 2nd Level Puts : 296
======> Query all test objects (2)
--> Entity Load Count : 593
--> 2nd Level Hits : 1
--> 2nd Level Misses : 1
--> 2nd Level Puts : 592
精确度:hit = 1是我在特定对象上启动的Id的查询结果。
感谢您的帮助。
答案 0 :(得分:0)
查询级缓存
这是一个可选功能,需要两个额外的物理缓存区域来保存缓存的查询结果和上次更新表时的时间戳。这仅适用于使用相同参数频繁运行的查询。
Query q = this.getEntityManager().createQuery("FROM " + entityClass.getSimpleName());
query.setCacheable(true);
List<E> result = q.getResultList();
return result;
有关查询缓存here
的更多信息