Hibernate缓存简介及分类

开发 后端
本文介绍Hibernate缓存。HIBERNATE中的CACHE有两级,一级是在Session范围内的CACHE,另一级CACHE是在SessionFactory范围的。

一、Hibernate缓存简介  Cache In Hibernate

HIBERNATE中的CACHE有两级.

一级是在Session范围内的CACHE. 即每个Session有自己的一个CACHE, 当前操作的对象都会被保留在CACHE中. 但是Session关闭后这个CACHE也就没有. 可见这级CACHE的生命期是很短的. (使用id进行关键字存储:缓存的key就是ID,value是POJO)(缓存的是实体对象)

另一级CACHE是在SessionFactory范围的, 可以被来自同一个SessionFactory的Session共享. 在HIBERNATE的文档中称其为SECOND LEVEL CACHE. 显然后者的优势较明显, 也比较复合当前的使用环境.   它可以使用不同的缓存实现,如EhCache、JBossCache、OsCache等 (二级缓存是缓存实体对象的)

还有一个类型的CACHE就是QueryCache. 它的作用就是缓存一个Query以及Query返回对象的Identifier以及对象的类型. 有了QueryCache后就可以高效的使用SECOND LEVEL CACHE.

hibernate缓存查询(hibernate默认是关闭的)
查询缓存是针对普通属性结果集的缓存
对实体对象的结果集只缓存id
查询缓存的生命周期,当前关联的表发生修改,那么查询缓存生命周期结束

查询缓存的配置和使用:

1. 启用查询缓存:在hibernate.cfg.xml中加入:

  1. < property name=”hibernate.cache.use_query_cache”>true< /property>   

2. 在程序中必须手动启用查询缓存,如:query.setCacheable(true);

QueryCache用来缓存查询语句, 及查询结果集中对象的Identifier与Type. 当再次使用已缓存的Query时, 就可以通过对象的Identifier与Type在SECOND LEVEL CACHE中查找实际的对象.

对于查询缓存来说,缓存的key是根据hql生成的sql,再加上参数,分页等信息(可以通过日志输出看到,不过它的输出不是很可读,最好改一下它的代码)。

注:一级缓存也叫session级的缓存或事务缓存。Hibernate二级缓存也称为进程级的缓存或SessionFactory级的缓存。二级缓存是全局缓存,它可以被所有的session共享。二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存。

二、Hibernate缓存的范围

Hibernate缓存的范围分为3类:
1.事务范围
     事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围.
2.应用范围
     应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围.
3.集群范围
     在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.

三、Hibernate缓存的方式

有四种,分别为:

CacheConcurrencyStrategy.NONE

CacheConcurrencyStrategy.READ_ONLY,只读模式,在此模式下,如果对数据进行更新操作,会有异常;

CacheConcurrencyStrategy.READ_WRITE,读写模式在更新缓存的时候会把缓存里面的数据换成一个锁,其它事务如果去取相应的缓存数据,发现被锁了,直接就去数据库查询;

CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不严格的读写模式则不会的缓存数据加锁;

CacheConcurrencyStrategy.TRANSACTIONAL,事务模式指缓存支持事务,当事务回滚时,缓存也能回滚,只支持JTA环境。

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

@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

四、Hibernate缓存的管理

一级缓存的管理:
evit(Object obj)  将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象. 
clear()  将一级缓存中的所有持久化对象清除,释放其占用的内存资源 
contains(Object obj) 判断指定的对象是否存在于一级缓存中. 
flush() 刷新一级缓存区的内容,使之与数据库数据保持同步.

二级缓存的管理:    

evict(Class arg0, Serializable arg1)  将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源.

evictCollection(String arg0)  将指定类的所有持久化对象的指定集合从二级缓存中清除,释放其占用的内存资源.

如何避免一次性大量的实体数据入库导致内存溢出
*先flush,再clear

如果数据量特别大,考虑采用jdbc实现,如果jdbc也不能满足要求,可以考虑采用数据库本身的特定导入工具

五、什么样的数据不适合放在二级缓存中来? 

下面这几种情况就不适合加载到二级缓存中: 
1.经常被修改的数据 
2.绝对不允许出现并发访问的数据 
3.与其他应用共享的数据 
下面这己种情况合适加载到二级缓存中: 
1.数据更新频率低 
2.允许偶尔出现并发问题的非重要数据 
3.不会被并发访问的数据 
4.常量数据 
5.不会被第三方修改的数据

六、二级缓存的配置

Hibernate的二级缓存功能是靠配置二级缓存插件来实现的,Hibernate为了集成这些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充当缓存插件与Hibernate之间的适配器 .

常用的二级缓存插件
EHCache  org.hibernate.cache.EhCacheProvider
OSCache  org.hibernate.cache.OSCacheProvider
SwarmCahe  org.hibernate.cache.SwarmCacheProvider
JBossCache  org.hibernate.cache.TreeCacheProvider

设置hibernate.cache.provider_class。

我们这里用ehcache,如
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
由于这是HIBERNATE默认的CACHE提供者, 所以无须做什么设置.

只要在src中添加ehcache的配置文件ehcache.xml:

  1. < ehcache>   
  2.  
  3.     < diskStore path="java.io.tmpdir"/>    
  4.  
  5.  
  6.     < defaultCache   maxElementsInMemory="10000"   eternal="false"  timeToIdleSeconds="120"          timeToLiveSeconds="120"  overflowToDisk="true"   />     
  7.  
  8.  
  9.     < cache name="goncha.hb.bean.Person"   maxElementsInMemory="10"       eternal="false"      
  10.  
  11.         timeToIdleSeconds="100"  timeToLiveSeconds="100"  overflowToDisk="false"   />       
  12.  
  13.       < cache name="goncha.hb.bean.Address"  maxElementsInMemory="10"     eternal="false"      
  14.  
  15.         timeToIdleSeconds="100"  timeToLiveSeconds="100"  overflowToDisk="false"    />       
  16.  
  17. < /ehcache>    

【编辑推荐】

  1. Hibernate中generator属性的意义
  2. hibernate Key Generator 主键生成方式
  3. Hibernate的主键生成机制
  4. hibernate的Query cache
  5. Hibernate中hbm的generator属性
     
责任编辑:book05 来源: 博客大巴
相关推荐

2009-07-02 09:23:27

Hibernate缓存

2009-06-26 16:19:32

Hibernate实现

2009-06-12 14:40:38

Hibernate AHibernate接口

2009-09-24 16:53:47

Hibernate A

2009-06-29 08:48:41

Hibernate缓存

2009-09-25 09:04:27

Hibernate类型

2009-09-27 09:46:45

Hibernate会话

2009-09-29 17:00:08

Hibernate c

2009-09-21 13:19:06

Hibernate s

2009-09-25 10:25:54

Hibernate缓存

2009-09-25 13:51:13

Hibernate S

2012-02-03 11:31:33

HibernateJava

2009-06-17 15:43:03

Hibernate缓存

2009-09-23 17:03:08

Hibernate S

2012-12-17 14:54:55

算法缓存Java

2009-09-24 08:48:54

Hibernate技术

2009-06-02 17:18:10

hibernate框架简介

2009-09-22 10:50:04

Hibernate c

2009-09-22 11:24:07

Hibernate查询

2021-11-30 10:58:52

算法缓存技术
点赞
收藏

51CTO技术栈公众号