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

Hibernate是一个面向JAVA环境的对象/关系数据库映射工具,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用面向对象编程思维来操纵关系数据库。对象/关系映射(Object/ Relational Mapping,简称ORM)把对象模型表示的对象映射到基于SQL的关系模型结构中去,使得Hibernate可以应用在任何使用JDBC的场合,可以应用到EJB的J2EE架构中,以取代CMP完成数据持久化的重任,也可以整合到J2EE系统中作为持久层框架。
  缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库与数据访问层之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高应用的运行性能。
  相对内存操作,数据库调用是一个代价高昂的过程,然而典型企业级应用结构,数据库往往和应用服务器位于不同的物理服务器,这就意味着每次数据库访问都是一次远程调用,数据的打包拆包,网络传输上的延时等消耗都给网络整体性能造成了严重影响。此时,本地内存中的数据缓存的存在价值就显得特别突出。
  对于ORM而言,缓存显得更为重要,它是持久层性能提升的关键。因为相对JDBC的数据存取,ORM的实现往往要借助更加复杂的机制,以实现内部状态的管理、OR关系的映射等。这些额外的开销使得ORM数据访问效率降低,数据缓存是弥补这里产生的性能差距的一个关键策略。特别是对于查询操作相对频繁的系统而言,良好的缓存管理机制以及合理的缓存应用模式往往是性能提升的关键。
  
  1 Hibernate的缓存机制
  
  1.1 持久化层的缓存的范围
  持久层设计中,往往需要考虑几个不同层次中的数据缓存策略。这些层次的划分标准针对不同情况有所差异,一般而言,ORM的数据缓存应包含如下几个层次:
  事物级缓存(Transaction Layer Cache)
  缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的对象形式。
  应用级/进程级缓存(Application/Process Layer Cache)
  缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。对象的松散数据形式有点类似于对象的序列化数据,但是对象分解为松散的算法比对象序列化的算法要求更快。
  集群级缓存(Cluster Layer Cache)
  在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,因为访问的速度不一定会比直接访问数据库数据的速度快多少。
  持久层提供以上多种层次的缓存。如果在事务级缓存中没有查到相应的数据,还可以到进程级或集群级缓存内查询,如果还是没有查到,那么只有到数据库中查询。事务级缓存是持久化层的第一级缓存,通常它是必需的;进程级或集群级缓存是持久化层的第二级缓存,通常是可选的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值