首页 » 网上的 » 正文

提高Grails应用的查询性能

 

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

<!–break–>

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

    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”,从而避免了上面的问题。


原文地址:http://feedproxy.google.com/~r/groovyq/~3/H_HgqBMCGhA/%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