hibernate缓存机制
一、首先来了解什么是缓存?
缓存是位于应用程序和物理数据源之间,用来临时存放数据的内存区域,目的是为了减少物理数据源和应用程序的访问次数,从而提高应用程序的运行性能。Hibernate的大多数查询在查询数据时,首先会到缓存中查找数据,如果找到就直接使用,如果没有找到才会去访问物理数据源,所以,把频繁使用的数据加载到缓存区中 ,就可以大大减少应用程序对物理数据源的访问,使得应用程序的性能打打提升。
二、Hibernate的缓存分类:
(1)、一级缓存(session级别的缓存):一级缓存的声明周期和session的声明周期一致,当前session一旦关闭,一级缓存就消失,因此一级缓存也叫session级别的缓存或事务级别的缓存。无论何时,当你给save()
、update()
或 saveOrUpdate()
方法传递一个对象时,或使用load()
、 get()
、list()
、iterate()
或scroll()
方法获得一个对象时,如果该对象在session缓存中不存在,该对象都将被加入到Session
的内部缓存中。
evit(Object obj) 将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象。
clear()将一级缓存中的所有持久化对象清除,释放其占用的内存资源。
contains(Objectobj)判断指定的对象是否存在于一级缓存中。
flush() 刷新一级缓存区的内容,使之与数据库数据保持同步。CacheMode
参数用于控制具体的Session如何与二级缓存进行交互。
CacheMode.NORMAL
- 从二级缓存中读、写数据。
CacheMode.GET
- 从二级缓存中读取数据,仅在数据更新时对二级缓存写数据。
CacheMode.PUT
- 仅向二级缓存写数据,但不从二级缓存中读数据。
CacheMode.REFRESH
- 仅向二级缓存写数据,但不从二级缓存中读数据。通过 hibernate.cache.use_minimal_puts
的设置,强制二级缓存从数据库中读取数据,刷新缓存内容。
三、二级缓存(应用级别的缓存和sessionFactory级别的缓存):由多个事务也就是由多个session共享。
1、什么样的数据适合放到二级缓存中?
1)、不经常被修改的数据。2)、经常被访问。3)、数量有限的数据
2、常用的缓存插件 Hibernater二级缓存是一个插件,下面是几种常用的缓存插件:
1)、EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。
2)、OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。
3)、SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。
4)、JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。3、基于Ehcache第三方缓存框架的配置步骤:
1)、hibernate.cfg.xml配置用来打开二级缓存,在这里使用的是ehCache第三方扩展
<propertyname="cache.use_second_level_cache">true</property>
<propertyname="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
2)、创建ehcache.xml文件,并加入ehcache依赖jar文件
3)、在需要放入二级缓存的类加入@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)配置,可以读写
4、什么查询可以读二级缓存?
load、get、iterator,而list的内容只会加入二级缓存,不会读取二级缓存。四、查询缓存
查询缓存是缓存普通属性结果集的,对实体对象的结果集只缓存id,查询缓存的生命周期,当关联的表发生修改,那么查询缓存的生命周期结束
查询缓存的配置和使用:
1、在配置文件hibernate.cfg.xml中启用查询缓存,如:
<propertyname="hibernate.cache.use_query_cache">true</property>
2、在程序中必须手动启用查询缓存,如:
query.setCachable(true);