现在的位置: 首页 > 综合 > 正文

基于hibernate缓存机制的查询性能优化研究(二)

2013年05月09日 ⁄ 综合 ⁄ 共 2154字 ⁄ 字号 评论关闭
1.2 hibernate缓存机制
  Hibernate提供了两种缓存,第一种是Session的缓存,又称为一级缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。如图1所示:
  图1 hibernate的二级缓存结构图
  第二种缓存是SessionFactory的缓存,又可以分为两类:内置缓存和外置缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。
  SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。
  
本文原文
  由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。二级缓存将由从属于本SessionFactroy的所有Session实例共享,因此有时成为SessionFactory Level Cache。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器(Cache Provider)用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。
  Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。
  1.4 二级缓存应用策略。
  二级缓存在一个SessionFactory中有效,是优化的重中之重,因此,各类策略也考虑的较多,但是并非所有的情况都适合于使用二级缓存,需要根据具体情况来决定。同时可以针对某一个持久化对象配置其具体的缓存策略。
  适合于使用二级缓存的情况:
  (1)数据不会被第三方修改;
  一般情况下,会被hibernate以外修改的数据最好不要配置二级缓存,以免引起数据不一致问题。但是如果此数据因为性能的原因需要被缓存,同时又有可能被第三方比如SQL修改,也可以为其配置二级缓存。只是需要在sql执行修改后手动清除cache,以保证数据的一致性。
  (2)数据大小在可接收范围之内;
   如果数据表数据量特别巨大,不适合配置二级缓存。原因是缓存的数据量过大可能会引起内存资源紧张,反而降低性能。
  如果数据表数据量特别巨大,但是经常使用的只是较新部分的数据,也可以为其配置二级缓存。但是必须单独配置其持久化类的缓存策略,比如最大缓存数、缓存过期时间等,将这些参数降低至一个合理的范围(太高会引起内存资源紧张,太低了缓存的意义不大)。
  (3)数据更新频率低;
   对于数据更新频率过高的数据,频繁同步缓存中数据的代价可能和从查询缓存中的数据获得的好处相当,坏处益处相抵消。此时缓存的意义也不大。
  (4)非关键数据(不是财务数据等)
   财务数据等是非常重要的数据,绝对不允许出现或使用无效的数据,所以此时为了安全起见最好不要使用二级缓存。
  
  2 基于缓存的优化策略
  
  =查询性能往往是一个系统性能表现的重要方面。相对数据库的更新、删除操作而言,查询机制的优劣很大程度决定了系统的整体性能。
  2.1 查询缓存的应用
  对于经常使用的查询语句,如果启用了查询缓存(Query Cache),当第一次执行查询语句时,hibernate会把查询结果存放在第二级缓存中。以后再执行该查询语句时,只需从缓存中获得查询结果,从而提高性能。
  查询缓存策略的一般过程如下:
  (1)Query Cache保存了之前查询执行过的Select SQL以及结果集等信息,组成一个Query Key。Query Key包括条件查询的请求一般信息:SQL, SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows)等。
  (2)当再次遇到查询请求的时候,就会根据Query Key 从Query Cache找,如果存在就返回这个结果列表;如果不存在,查询数据库获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。
  (3)但是两次查询之间,数据表发生数据变动的话,Hibernate就会自动清除Query Cache中对应的Query Key。
  为了启用Query Cache,我们需要在hibernate.cfg.xml中进行配置,参考配置如下(只列出核心配置项):
  

抱歉!评论已关闭.