(转)提高Grails应用的查询性能

转载地址:http://www.groovyq.net/content/%E6%8A%80%E5%B7%A7%EF%BC%9A%E6%8F%90%E9%AB%98grails%E5%BA%94%E7%94%A8%E7%9A%84%E6%9F%A5%E8%AF%A2%E6%80%A7%E8%83%BD

想提高你的Grails应用的性能么?Schneide Blog上提供了一个简单而又容易让人忽视的技巧。

事情一开始是这样子滴:作者遇到了一个奇怪问题:重复执行查询,例如:

Child.findAllByParent(parent)


却发现花费的时间一次比一次多,比如第一次查询花费40ms,第二次就多了1ms,依次类推。想尽了办法,如:加索引、清空会话、使用HQL,问题依旧!

最后发现使用如下设置:
session.setFlushMode(FlushMode.COMMIT)

问题解决了,而且还比原来快了10倍!原来,Grails里flush的缺省方式为Auto,按照Hibernate的文档(或见Java Persistence with Hibernate),若flush模式为Auto,Hibernate有可能会在某些查询前提交数据,尤其是当会话中的内存对象的变化可能影响查询结果的时候。Hibernate的论坛里也有相关的jira issue。

文后的评论里,Lari H给出另一种设置flush模式的方法(DataSource.groovy中):

hibernate {
flush.mode='commit'
}

此外,他还给出了另外2个跟Hibernate性能相关的链接(这里和这里)。其中的主要做法都是采用readOnly来提高性能,此时的Hibernate将不会进行“Dirty Check”,从而避免了上面的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值