注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

创新改变世界

you changed the world

 
 
 

日志

 
 

Hibernate如何提升数据库查询的性能  

2014-04-08 10:03:12|  分类: web |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
数据库查询性能的提升涉及到开发中的各个阶段,在开发中选用正确的查询方法无疑是最基础也最简单的。
SQL语句的优化
      使用正确的SQL语句可以在很大程度上提高系统的查询性能。获得同样数据而采用不同方式的SQL语句在性能上的差距可能是十分巨大的。
     由于Hibernate是对JDBC的封装,SQL语句的产生都是动态有Hibernate自动完成的。Hibernate产生SQL语句的方式有两种:一种是通过开发人员编写的HQL语句来生成,另一种是依据开发人员对关联对象的访问来自动生成响应的SQL语句。
      至于使用什么样的SQL语句可以获得更好的性能要依据数据库的结构以及所要获取数据的具体情况来处理。在确定了所要执行的SQL语句后,可以通过以下三个方面来影响Hibernate所产生的SQL语句:
(1)HQL语句的书写方法;
(2)查询时所使用的查询方法;
(3)对相关联时所使用的抓取策略;
使用正确的查询方法
    在前面已经介绍过,执行数据查询功能的基本方法有两种:一种是得到单个持久化对象的get()方法和load()方法,另一种是Query对象的list()方法和iterator()方法。在开发中应该依据不同的情况选用正确的方法。
    get()方法和load()方法的区别在于对二级缓存的使用上。load()方法会使用二级缓存,而get()方法在一级缓存没有找到的情况下会直接查询数据库,不回去二级缓存中查找。在使用中,对使用了二级缓存的对象进行查询时最好使用load()方法,以充分利用二级缓存来提高查询的效率。
   list()方法和iterator()方法之间的区别可以从以下几个方面来进行比较。
   (1)执行的查询不同。list()方法在执行时,是直接运行查询结果所需要的查询语句,而iterator()方法则是先执行得到对象ID的查询,然后再根据每个ID值去取得所要查询的对象。因此,对于list()方式的查询通常只会执行一个SQL语句,而对于iterator()方法的查询则可能需要执行N+1条SQL语句。
    (2)缓存的使用。list()方法只能使用二级缓存中的查询缓存,而无法使用二级缓存对单个对象的缓存。所以,除非重复执行相同的查询操作,否则无法利用缓存的机制来提高查询的效率。iterator()方法则可以充分利用二级缓存,在根据ID检索对象的时候首先到缓存中查找,只有在找不到的情况下才会执行响应的查询语句。所以,缓存中对象的存在与否会影响到SQL语句的执行数量。
     (3)对于结果集的处理方法不同。list()方法会一次获得所有的结果集对象,而且它会依据查询的结果初始化所有的结果集对象。iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。
  评论这张
 
阅读(47)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017