`

hibernate与应用缓存方案总结

阅读更多

 

XXXX项目是目前在实际工作中正在做的事情,该项目是一个大型系统的内容管理内核,负责最核心的meta data的集中管理,性能有较高的要求,设计初期就要求能够支持cluster。项目使用hibernate 3.2,针对开发过程中对于各种缓存的不同看法,撰写了本文。重点在于澄清一些hibernate的缓存细节,纠正一些错误的缓存用法。

 

一、hibernate的二级缓存 

如果开启了二级缓存,hibernate在执行任何一次查询的之后,都会把得到的结果集放到缓存中,缓存结构可以看作是一个hash table,key是数据库记录的id,value是id对应的pojo对象。当用户根据id查询对象的时候(load、iterator方法),会首先 在缓存中查找,如果没有找到再发起数据库查询。但是如果使用hql发起查询(find, query方法)则不会利用二级缓存,而是直接从数据库获得数据,但是它会把得到的数据放到二级缓存备用。也就是说,基于hql的查询,对二级缓存是只写 不读的。

 

针对二级缓存的工作原理,采用iterator取代 list来提高二级缓存命中率的想法是不可行的。Iterator的工作方式是根据检索条件从数据库中选取所有目标数据的id,然后用这些id一个一个的 到二级缓存里面做检索,如果找到就直接加载,找不到就向数据库做查询。因此假如iterator检索100条数据的话,最好情况是100%全部命中,最坏 情况是0%命中,执行101条sql把所有数据选出来。而list虽然不利用缓存,但是它只会发起1条sql取得所有数据。在合理利用分页查询的情况下, list整体效率高于iterator。

 

二级缓存的失效机制由hibernate控制,当某条数据被修改之后,hibernate会根据它的id去做缓存失效操作。基于此机制,如果数据表不是被hibernate独占(比如同时使用jdbc或者ado等),那么二级缓存无法得到有效控制。

 

由于hibernate的缓存接口很灵活,cache provider可以方便的切换,因此支持cluster环境不是大问题,通过使用swarmcache、jboss cache等支持分布式的缓存方案,可以实现。但是问题在于: 

1、 分布式缓存本身成本偏高(比如使用同步复制模式的jboss cache) 

2、 分布式环境通常对事务控制有较高要求,而目前的开源缓存方案对事务缓存(transaction cache)支持得不够好。当jta事务发生会滚,缓存的最后更新结果很难预料。这一点会带来很大的部署成本,甚至得不偿失。

 

结论:XXXX不应把hibernate二级缓存作为优化的主要手段,一般情况下建议不要使用。

 

原因如下: 

1、 XXXX 的DAO类大部分是从1.0升级过来,由于1.0采用的是hibernate 2.1,所以在批量删除数据的时候采用了native sql的方式。虽然XXXX2.0已经完全升级到hibernate 3.2,支持hibernate原生的批量删改,但是由于hibernate批量操作的性能不如sql,而且为了兼容1.0的dao类,所以很多地方保留 了sql操作。哪些数据表是单纯被hibernate独占无法统计,而且随着将来业务的发展可能会有很大变数。因此不宜采用二级缓存。 

2、 针对系统业务来说,基于id检索的二级缓存命中率极为有限,hql被大量采用,二级缓存对性能的提升很有限。 

3、 hibernate 3.0在做批量修改、批量更新的时候,是不会同步更新二级缓存的,该问题在hibernate 3.2中是否仍然存在尚不确定。

 

二、hibernate的查询缓存

 

查询缓存的实现机制与二级缓存基本一致,最大的差异在于放入缓存中的key是查询的语句,value是查询之后得到的结果集的id列表。表面看来这 样的方案似乎能解决hql利用缓存的问题,但是需要注意的是,构成key的是:hql生成的sql、sql的参数、排序、分页信息等。也就是说如果你的 hql有小小的差异,比如第一条hql取1-50条数据,第二条hql取20-60条数据,那么hibernate会认为这是两个完全不同的key,无法 重复利用缓存。因此利用率也不高。

 

另外一个需要注意的问题是,查询缓存和二级缓存是有关联关系的,他们不是完全独立的两套东西。假如一个查询条件hql_1,第一次被执行的时候,它 会从数据库取得数据,然后把查询条件作为 key,把返回数据的所有id列表作为value(请注意仅仅是id)放到查询缓存中,同时整个结果集放到class缓存(也就是二级缓存),key是 id,value是pojo对象。当你再次执行hql_1,它会从缓存中得到id列表,然后根据这些列表一个一个的到class缓存里面去找pojo对 象,如果找不到就向数据库发起查询。也就是说,如果二级缓存配置了超时时间(或者发呆时间),就有可能出现查询缓存命中了,获得了id列表,但是 class里面相应的pojo已经因为超时(或发呆)被失效,hibernate就会根据id清单,一个一个的去向数据库查询,有多少个id,就执行多少 个sql。该情况将导致性能下降严重。

 

查询缓存的失效机制也由 hibernate控制,数据进入缓存时会有一个timestamp,它和数据表的timestamp对应。当hibernate环境内发生save、 update等操作时,会更新被操作数据表的timestamp。用户在获取缓存的时候,一旦命中就会检查它的timestamp是否和数据表的 timestamp匹配,如果不,缓存会被失效。因此查询缓存的失效控制是以数据表为粒度的,只要数据表中任何一条记录发生一点修改,整个表相关的所有查 询缓存就都无效了。因此查询缓存的命中率可能会很低。

 

结论:XXXX不应把hibernate二级缓存作为优化的主要手段,一般情况下建议不要使用。

 

原因如下: 

1、 XXXX的上层业务中检索条件都比较复杂,尤其是涉及多表操作的地方。很少出现重复执行一个排序、分页、参数一致的查询,因此命中率很难提高。 

2、 查询缓存必须配合二级缓存一起使用,否则极易出现1+N的情况,否则性能不升反降 

3、 使用查询缓存必须在执行查询之前显示调用Query.setCacheable(true)才能激活缓存,这势必会对已有的hibernate封装类带来问题。

 

总结 

详细分析hibernate的二级缓存和查询缓存之后,针对XXXX项目的具体情况做出结论,在底层使用通用缓存方案的想法基本上是不可取的。比较好的做 法是在高层次中(业务逻辑层面),针对具体的业务逻辑状况手动使用数据缓存,不仅可以完全控制缓存的生命周期,还可以针对业务具体调整缓存方案提交命中 率。 Cluster中的缓存同步可以完全交给缓存本身的同步机制来完成。比如开源缓存swarmcache采用invalidate的机制,可以根据用户指定 的策略,在需要的时候向网络中的其他swarmcache节点发送失效消息,这一机制和XXXX1.0中已经采用的MappingCache的同步方案基 本一致。建议采用。

转自:http://www.wujianrong.com/archives/2007/08/hibernate-13.html

分享到:
评论

相关推荐

    使用memcached基于hibernate之上的高效数据库缓存架构方案(含源代码)

    包含了分布式解决方案,该系统已经应用在舍得网上了,没有发现大问题,本人也相信该系统已经足够强大,应付数百万IP/天的应用都不是问题,我这么说肯定有人会对此表示怀疑,其实系统到底能撑多少IP/天不在于系统本身...

    hibernate_5.1包

    hibernate各个包 ...hibernate-oscache: 支持oscache的缓冲解决方案。(OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。 O

    Oscache-入门教程.doc

    Cache是一种用于提高系统...OSCache是当前运用最广的缓存方案,JBoss,Hibernate,Spring等都对其有支持。 Oscache的使用非常方便,特别是jsp cache用的非常广泛。Oscache的文档中也对jsp cache tag的配置有详细说明。

    J2EE系统设计方案.doc

    Hibernate二级缓存 11 3. JSP页面缓存 11 五、 软件成本比较 11 1. 技术平台 J2EE(Java 2 Enterprise Edition)是建立在Java 2平台上的企业级应用的解决方案。J2EE技术的基础便是Java 2平台,不但有J2SE平台的所有...

    J2EE系统设计方案(1).doc

    Hibernate二级缓存 11 3. JSP页面缓存 11 五、 软件成本比较 11 1. 技术平台 J2EE(Java 2 Enterprise Edition)是建立在Java 2平台上的企业级应用的解决方案。J2EE技术的基础便是Java 2平台,不但有J2SE平台的所有...

    基于SSHI架构的开发平台技术方案

    基于J2EE平台软件的终级解决方案,采用最新的J2EE...平台集成系统管理模块,包括:(1)服务器系统信息监控 (2)组织机构管理 (3)用户管理 (4)角色管理 (5)资源菜单管理 (6)数据字典管理 (7)在线用户管理(8)应用级缓存管理

    Bug管理系统 struts2+sping2.5+hibernate3(1-2)

    主要展示技术包括:三层架构 freemarker模版 面向切面编程 邮件发送 定时任务 缓存管理 运行环境: 1 TOMCAT 5.5及以上版本. 2 JDK5.0及以上版本. 3 ECLIPSE3.2 及以上版本. 4 MySQL5.0 注意事项: 1 TOMCAT安装...

    Bug管理系统 struts2+sping2.5+hibernate3(2-2)

    主要展示技术包括:三层架构 freemarker模版 面向切面编程 邮件发送 定时任务 缓存管理 运行环境: 1 TOMCAT 5.5及以上版本. 2 JDK5.0及以上版本. 3 ECLIPSE3.2 及以上版本. 4 MySQL5.0 注意事项: 1 TOMCAT安装...

    计算机软件项目设计方案(2020).docx

    1.2.2LEAF6平台总体架构 LEAF6平台核心框架定义控制层、业务层、数据访问层的命名方式和实现规则,制定了分布式缓存、并行计算、分布式消息队列、非结构化存储可扩展技术服务的接口规范,对应用集成管理、组织机构...

    网站设计方案(完整版).doc

    XXX公司 XX发布平台 设计方案 XX单位 2022年12月 1、概述 阐述项目建设背景…… 项目必要性、先进性…… 2、建设目标 1、宣传公司、中心的管理理念,促进企业文化的建设与传播; 2、实现对外信息发布的信息资源分类...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    Spring3.x企业应用开发实战(完整版) part1

    17.4.5 使用Hibernate二级缓存 17.5 对持久层进行测试 17.5.1 配置Unitils测试环境 17.5.2 准备测试数据库及测试数据 17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的...

    Spring.3.x企业应用开发实战(完整版).part2

    17.4.5 使用Hibernate二级缓存 17.5 对持久层进行测试 17.5.1 配置Unitils测试环境 17.5.2 准备测试数据库及测试数据 17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的...

    应用层查询语言PHP库.zip

    <...如果只使用中心缓存,只能减小数据库的压力,对于网络带宽的压力,还是有的,速度上也远远逊于本地缓存的效果,所以要结合本地缓存+中心缓存的策略方案,即提高速度,避免群集复制时的瓶颈。

    计算机毕业设计-JavaSmart系统-系统框架设计与开发(源代码+论文)

    JavaSmart系统是一个基于Java EE平台开发的企业级系统框架,它为快速构建和部署复杂的业务应用程序提供了一套完整的解决方案。该系统框架采用模块化设计,利用Spring框架实现依赖注入和事务管理,使用Spring MVC处理...

    基于struts+hibernate+spring+easyui+mysql的网上商城项目实战源码.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    J2EE核心:iBatis_DAO入门与进阶.doc

    现在我们要修改这个应用,将这个关系表储存在一个XML文件中而不是存在关系数据库中,或者使用Hibernate来实现SELECT请求,而用SQL Map来执行其他请求,因为Hibernate提供了对高速缓存更好的支持。这样的修改很难实现...

    提升Ruby on Rails性能的几个解决方案

    简介 Ruby On Rails 框架自它提出之日...Rails 是一个真正彻底的 MVC(Model-View-Controller) 框架,Rails 清楚地将你的模型的代码与你的控制器的应用逻辑从 View 代码中分离出来。Rails 开发人员很少或者可能从未遇到

    网上体育商城的设计与实现毕业设计答辩PPT.pptx

    简单来说,Hibernate是一个轻量级的ORM(对象关系映射)解决方案或java工具、Hibernate框架进行简化,用java开发应用程序与数据库的交互。Hibernate框架的主要优点是:比起JDBC,Hibernate没有很多复杂的SQL语句需要...

    SpringBoot项目基于springboot搭建的疫情管理系统.zip

    SpringBoot项目疫情管理系统是一个基于Java SpringBoot框架开发的综合性应用平台,旨在为公共卫生决策者、医疗机构和普通用户提供及时、准确的疫情信息与管理工具。该系统通过集成数据收集、实时监控、资源调度和...

Global site tag (gtag.js) - Google Analytics