`
javaeyetodj
  • 浏览: 425565 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate缓存简介及分类

阅读更多

一、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>    
分享到:
评论

相关推荐

    HIBERNATE的缓存机制

    首先说下Hibernate缓存的作用(即为什么要用缓存机制),然后再具体说说Hibernate中缓存的分类情况,最后可以举个具体的例子。 Hibernate缓存的作用: Hibernate是一个持久层框架

    Hibernate+中文文档

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    hibernate3.2中文文档(chm格式)

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    HibernateAPI中文版.chm

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    SSH框架详解

    Hibernate工作原理、Hibernate的核心组件、Persistent Object、Hibernate的运行过程、Hibernate缓存的作用、Hibernate缓存分类、Hibernate优点、 Hibernate缺点、spring原理 、AOP(Aspect-Oriented Programming): ...

    hibernate 教程

    分类 14.1.2. Lists, maps 和sets用于更新效率最高 14.1.3. Bag和list是反向集合类中效率最高的 14.1.4. 一次性删除(One shot delete) 14.2. 用于延迟装载的代理 14.3. 第二层缓存(The Second Level...

    Hibernate 中文 html 帮助文档

    分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of ...

    Hibernate中文详细学习文档

    分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测...

    hibernate 体系结构与配置 参考文档(html)

    二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. ...

    最全Hibernate 参考文档

    分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测...

    Hibernate教程

    20.5.1. 分类(Taxonomy) 20.5.2. Lists, maps 和sets用于更新效率最高 20.5.3. Bag和list是反向集合类中效率最高的 20.5.4. 一次性删除(One shot delete) 20.6. 监测性能(Monitoring performance) 20.6.1...

    hibernate

    分类 14.1.2. Lists, maps 和sets用于更新效率最高 14.1.3. Bag和list是反向集合类中效率最高的 14.1.4. 一次性删除(One shot delete) 14.2. 用于延迟装载的代理 14.3. 第二层缓存(The Second Level...

    Hibernate参考文档

    分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测...

    Hibernate3+中文参考文档

    分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测...

    hibernate3.04中文文档.chm

    20.5.1. 分类(Taxonomy) 20.5.2. Lists, maps 和sets用于更新效率最高 20.5.3. Bag和list是反向集合类中效率最高的 20.5.4. 一次性删除(One shot delete) 20.6. 监测性能(Monitoring performance) ...

    hibernate 框架详解

    二级缓存与查询缓存 4.4.5. 查询语言中的替换 4.4.6. Hibernate的统计(statistics)机制 4.5. 日志 4.6. 实现NamingStrategy 4.7. XML配置文件 4.8. J2EE应用程序服务器的集成 4.8.1. 事务策略配置 4.8.2...

    低清版 大型门户网站是这样炼成的.pdf

    5.8.1 hibernate的缓存分类 332 5.8.2 hibernate的缓存范围 332 5.8.3 hibernate的缓存管理 333 5.8.4 hibernate二级缓存的并发访问策略 333 5.8.5 hibernate的二级缓存配置 334 5.9 hibernate应用的性能优化 ...

    SpringBoot项目基于多维分类的知识管理系统.zip

    技术实现上,后端使用SpringBoot简化开发流程和配置工作,SpringMVC负责请求响应周期,MyBatis或Hibernate作为ORM工具与MySQL或其他数据库交互。前端可能采用Angular、React或Vue.js等现代JavaScript框架构建一个...

    基于SSH模拟当当网项目(电子商务平台)

    查询缓存适用于主页面左侧分类菜单显示功能. (参考hibernate06内容及示例) 2.fetch和cache的使用 利用join fetch可以提高查询效率,将关联属性随着主对象一起采用表连接的形式查询. 如果使用了join fetch的话,查询...

Global site tag (gtag.js) - Google Analytics