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);

相关推荐