下面我们来了解一下hibernate中的缓存机制:一级缓存、二级缓存、查询缓存。
一级缓存:session间不能共有一级缓存,一级缓存会伴随着session的消亡而失效。
二级缓存:
1、二级缓存需要sessionFactory来管理,是进程级别的缓存,所有人都可以使用,是共享的。
2、二级缓存比较复杂,一般用第三方的产品,hibernate只提供了一个简单的实现,用hashtable实现的。
3、使用场合:长时间不改变的数据。
4、配置步骤:
(1)ehcache.xml 可以设置默认的,所有的类都遵循这个配置,也可以对某个对象单独的配置。
(2)在hibernate.cfg.xml配置文件配置缓存,让hibernate知道我们使用的是那个二级缓存。包括配置属性:是否启用二级缓存、二级缓存的提供商。
(3)手动指定哪些实体类的对象放到缓存,在hibernate.cfg.xml配置
<class-cache class="com.bjpowernode.hibernate.Student" usage="read-only"/>
或者
在映射文件中的id标签前面<cache usage="read-only"/>
usage属性表示使用缓存的策略,一般优先使用read-only,表示如果数据放到缓存,就不能再修改了,因为经常修改的数据也不需要放到缓存中。
read-only策略效率好,因为不能改缓存,但是可能出现脏数据的问题,这个问题的解决方案只能依赖缓存的超时,因为可能对象的数据被修改了,但是
缓存却没有变,这样造成数据不同步,也就是脏数据的问题。
read-write当持久化对象发生变化时,缓存里面就会跟着变化,数据库中也改变了,这种方式需要加上锁,效率比read-only慢。
5、知识点:
二级缓存必须让sessionfactory管理,让sessionfactory来清除,可以调用evict方法。
查询数据后会默认放到二级和一级缓存中,我们也可以控制查询出来的数据不放到缓存里面的,就是说我们可以控制一级缓存和二级缓存的交换。
session.setCacheMode(CacheMode.IGNORE);禁止将一级缓存中的数据往二级缓存里放。
和一级缓存一样,二级缓存也不存放普通属性的查询数据,这和一级缓存是一样的,只存放实体对象。
session级别的缓存对性能提高没有太大的意义,因为生命周期太短了。
查询缓存:
1、 一级缓存和二级缓存都只是存放实体对象的,如果查询实体对象的普通属性的数据,只能放到查询缓存里面,查询缓存还存放查询实体对象的id。
2、查询缓存的生命周期不确定,当它关联的表发生修改时(通过hibernate),查询缓存的生命周期就结束。
3、查询缓存默认是关闭的,可以在hibernate.cfg.xml配置<property name="hibernate.cache.use_query_cache">true</property>。并且必须在程序中手动启动查询缓存,在query接口中的setCacheable(true)方法来启用。
4、查询缓存意义不是很大,查询缓存说明白了就是存放由list方法或者iterate方法查询的数据,我们在查询时很少出现完全相同的条件查询,这就是说命中率低,
这样的缓存里的数据总是变化的。除非多次查询都是查询相同条件的数据,也就是说返回的结果总是一样,这样的缓存配置才有意义。
hibernate回顾之缓存机制-一级缓存、二级缓存、查询缓存,布布扣,bubuko.com
hibernate回顾之缓存机制-一级缓存、二级缓存、查询缓存
原文地址:http://blog.csdn.net/andywuchuanlong/article/details/27565083