Hibernate缓存配置

来源:互联网 发布:淘宝店铺不在了能退吗 编辑:程序博客网 时间:2024/05/12 03:32

Hibernate的缓存分为:

一级缓存:在Session级别的,在Session关闭的时候,一级缓存就失效了。
二级缓存:在SessionFactory级别的,它可以使用不同的缓存实现,如EhCache、JBossCache、OsCache等。

缓存的注释写法如下,加在Entity的java类上:

@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

缓存的方式有四种,分别为:

CacheConcurrencyStrategy.NONE
CacheConcurrencyStrategy.READ_ONLY,只读模式,在此模式下,如果对数据进行更新操作,会有异常;
CacheConcurrencyStrategy.READ_WRITE,读写模式在更新缓存的时候会把缓存里面的数据换成一个锁,其它事务如果去取相应的缓存数据,发现被锁了,直接就去数据库查询;
CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不严格的读写模式则不会的缓存数据加锁;
CacheConcurrencyStrategy.TRANSACTIONAL,事务模式指缓存支持事务,当事务回滚时,缓存也能回滚,只支持JTA环境。

另外还有如下注意事项:

1、查询缓存需要在Query的相应方法执行前加上这么一句:

query.setCacheable(true);

在使用Hibernate时,获得的query有setCacheable方法,可以设置使用缓存,但当使用JPA时,javax.persistence.Query并没有setCacheable方法,此时如果JPA的实现是Hibernate时,可以将其进行如下转化,再调用setCacheable方法(如果JPA的实现是其它ORMAP框架,就不知道怎么做了)。

if (query instanceof org.hibernate.ejb.QueryImpl) {

    ((org.hibernate.ejb.QueryImpl) query).getHibernateQuery().setCacheable(true);

}

2、还有就是查询缓存的查询执行后,会将查询结果放入二级缓存中,但是放入的形式是以ID为Key,实例作为一个Value。

3、hibernate的配置文件中需加入如下信息:

<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />

<property name="hibernate.cache.use_second_level_cache" value="true" />

<property name="hibernate.cache.use_query_cache" value="true" />



二级缓存配置:   
  
1、首先要打开二级缓存,在hibernate.cfg.xml中添加如下配置:   
<property name="hibernate.cache.use_second_level_cache">true</property>  
  
2、Hibernate的二级缓存使用第三方的缓存工具来实现,所以我们需要指定Hibernate使用哪个   
   缓存工具。如下配置指定Hibernate使用EhCache缓存工具。   
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
  
3、Hibernate在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象,   
在实体对象的映射文件中(相应的<class>标签内部),添加如下配置:   
<cache usage="read-only"/>  
  
usage="read-only"是“只读”缓存策略。   
  
注意,这个<cache>标签只能放在<class>标签的内部,而且必须处在<id>标签的前面!!!   
这个<cache>标签放在哪些<class>标签下面,就说明会多这些类的对象进行缓存   
  
4、对于第3步,有一个可选的方案是在hibernate.cfg.xml文件中指定哪些类的对象需要缓存,   
   而不需要使用<cache>标签来指定。如:   
   在hibernate.cfg.xml中添加如下配置:   
   <class-cache class="com.bjsxt.hibernate.Classes" usage="read-only" />  
     
   注意,这个<class-cache>标签必须放在<mapping>标签的后面!!  

原创粉丝点击