快速业务通道

加速你的Hibernate引擎(下) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
分钟。我们识别出了以下这些问题:

由于会话缓存和二级缓存的原因,系统会频繁地内存溢出。

就算没有内存溢出,当内存消耗很高时GC的开销也会很大。

我们还未设置fetch_size。

就算我们设置了batch_size,for循环也创建了太多update SQL语句。

不幸的是Spring 2.5不支持Hibernate无状态会话,所以我们只能关闭二级缓存;设置fetch_size;用DML风格的更新来代替for循环,以此改善性能。

但是,执行时间还是要6分钟。将Hibernate的日志级别调成trace后,我们发现是更新会话缓存造成了延时。通过在DML更新前清除会话缓存,我们将时间缩短到了4分钟,全部都是将数据加载到会话缓存中花费的时间。

加速你的Hibernate引擎(下)(6)

时间:2010-12-30 infoq 译:丁雪丰

4.10 SQL生成调优

本节将向你展示如何减少SQL生成的数量。

4.10.1 N+1抓取问题

“select抓取”策略会导致N+1问题。如果“连接抓取”策略适合你的话,你应该始终使用该策略避免N+1问题。

但是,如果“连接抓取”策略执行效果不理想,就像4.7.2节中那样,你可以使用“subselect抓取”、“批量抓取”或“延迟集合抓取”来减少所需的额外SQL语句数。

4.10.2 Insert+Update问题

范例11

我们的ElectricityDeal与DealCharge有单向one-to-many关联,如下列HBM文件片段所示:

<class name="ElectricityDeal"          select-before-update="true" dynamic-update="true"          dynamic-insert="true">      <id name="key" column="ID">          <generator class="sequence">              <param name="sequence">SEQ_ELECTRICITY_DEALS</param>          </generator>      </id>      …       <set name="dealCharges" cascade="all-delete-orphan">          <key column="DEAL_KEY" not-null="false" update="true"                on-delete="noaction"/>          <one-to-many class="DealCharge"/>      </set> </class>

在“key”元素中,“not-null”和“update”对应的默认值是false和true,上述代码为了明确这些取值,将它们写了出来。

如果你想创建一个ElectricityDeal和十个DealCharge,会生成如下SQL语句:

1句ElectricityDeal的插入语句;

10句DealCharge的插入语句,其中不包括外键“DEAL_KEY”;

10句DealCharge字段“DEAL_KEY”的更新语句。

为了消除那额外的10句更新语句,可以在那10句DealCharge插入语句中包含“DEAL_KEY”,你需要将“not-null”和“update”分别修改为true和false。

另一种做法是使用双向或many-to-one关联,让DealCharge来管理关联。

4.10.3 更新前执行select

在范例11中,我们为ElectricityDeal加上了select-before-update,这会对瞬时(transient)对象或分离(detached)对象产生额外的select语句,但却能避免不必要的数据库更新。

你应该做出一些权衡,如果对象没多少属性,不需要防止不必要的数据库更新,那么就不要使用该特性,因为你那些有限的数据既没有太多网络传输开销,也不会带来太多数据库更新开销。

如果对象的属性较多,例如是一张大的遗留表,那你应该开启该特性,和“

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号