【原】Hibernate 缓存

 Hibernate 缓存

一、什么是缓存,缓存的作用

       Hibernate是一个持久层框架,经常访问物理数据库,使用缓存可以降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。

缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。  Hibernate在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问,使得程序的运行性能明显的提升。

二、Hibernate缓存分类

Hibernate缓存有两大类:

一级session级别缓存:属于Hibernate的内置缓存,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓存)由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存

二级SessionFactory级别缓存:由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别;第二级缓存是可选的,是一个可配置的插件;(什么样的类被适合放在二级缓存中:a: 经常被访问的数据;b: 数据量有限;c:改动少;如:用户的权限、组织机构等)

    三级缓存又成为查询缓存,是二级缓存的一种特殊情况。

三、怎么应用Hibernate缓存

1、  一级缓存

load()


【原】Hibernate 缓存
 

Result:两次查询,只发一次SQL请求

  
【原】Hibernate 缓存
 

在不同session里查询

 
【原】Hibernate 缓存
 

Result:


【原】Hibernate 缓存
 

hibernatesession提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,多线程查询数据,每次都要去不同的session里查找,这种情况下的查询,每个session关闭的时候,一级缓存就失效了。所以可以利用二级缓存解决此问题。

2、  二级缓存(The Second Level Cache)

1)、二级缓存是SessionFactory级别的全局缓存。Hibernate支持多种多样的二级缓存实现,Hibernate自己写的HashTableCatcheProvider只是用在测试里,真正的产品里不会用它,由其他的厂商来提供。

 
【原】Hibernate 缓存
 

2)、EhCatcheProviderHibernate3.2默认的提供方式,支持范围为内存,硬盘等,如果内存放不下了,它会存到本地硬盘上,这样相对于远程数据库也是比较快的

 

3)、打开二级缓存

Ihibernate.cfg.xml的配置

 
【原】Hibernate 缓存
 

II@Cache注解

 
【原】Hibernate 缓存
 

4)、ehcache.xml配置

ehcache.xml真正指明了怎么设置二级缓存,而且可以写自己的缓存策略。

默认缓存策略

 
【原】Hibernate 缓存
 

自定义缓存策略

 
【原】Hibernate 缓存
 

 

5)、测试

 
【原】Hibernate 缓存
 

配置好二级缓存,在不同的session里查询相同的sql语句就不再有第二次sql请求

注:Load()iterate()默认使用二级缓存;list()默认往二级缓存加数据,但查询的时候不使用;List将从数据库查出的数据放入缓存,因为每次查询条件不能保证一样,所以无法从缓存中查询;

List():

 
【原】Hibernate 缓存
 
【原】Hibernate 缓存
 

 

Iterate()

 
【原】Hibernate 缓存
 

Result: 


【原】Hibernate 缓存
  
【原】Hibernate 缓存
 
【原】Hibernate 缓存
 

3、  查询缓存

1)、概念:特殊的二级缓存,是指的重复查询的缓存,如果查询条件不一样,那就用不了缓存,没有相应的算法去实现;

2)、配置:

查询缓存是依赖于二级缓存的,所以首先要打开配置好二级缓存

 

 

3)、实例:

 

 

4)、测试:

发两条List请求,不会产生两条SQL语句,而且是可以在不同的session

 
【原】Hibernate 缓存
 

四、总结

Hibernate查找对象如何应用缓存?

Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照ID放入到缓存;删除、更新、增加数据的时候,同时更新缓存。

Hibernate管理缓存实例

无论何时,我们在管理Hibernate缓存(Managing the caches)时,当你给save()update()saveOrUpdate()方法传递一个对象时,或使用load() get()list()iterate() scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。当随后flush()方法被调用时,对象的状态会和数据库取得同步。如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict() 方法,从一级缓存中去掉这些对象及其集合。

你可能感兴趣的:(Hibernate,session)