加速你的Hibernate引擎(下) - 编程入门网
分钟。我们识别出了以下这些问题:
由于会话缓存和二级缓存的原因,系统会频繁地内存溢出。 就算没有内存溢出,当内存消耗很高时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文件片段所示:
在“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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |