我们正在使用我们的grails应用程序开发性能,看起来grails需要很长时间(7-13ms)才能退出服务器返回Controller。返回的数据是对域对象的引用(具有2个引用的Map),不是很复杂。有没有办法缩短这个时间?
我们在服务中的return语句之前有log.debug(),在控制器中有离开服务之后的另一个。
2012-02-01 15:16:07,048 [http-8080-1] DEBUG api.TestService test before service return
2012-02-01 15:16:07,063 [http-8080-1] DEBUG api.TestController test after service return
编辑:Grails版本1.3.7
编辑:打开hibernate SQL日志后:
2012-02-02 09:20:04,504 [http-localhost%2F127.0.0.1-8080-1] DEBUG api.TestService before return
2012-02-02 09:20:04,505 [http-localhost%2F127.0.0.1-8080-1] DEBUG hibernate.SQL select nextval ('hibernate_sequence')
2012-02-02 09:20:04,516 [http-localhost%2F127.0.0.1-8080-1] DEBUG hibernate.SQL insert into test ...
2012-02-02 09:20:04,520 [http-localhost%2F127.0.0.1-8080-1] DEBUG hibernate.SQL update test1 ...
2012-02-02 09:20:04,522 [http-localhost%2F127.0.0.1-8080-1] DEBUG hibernate.SQL insert into test_test1 ...
2012-02-02 09:20:04,524 [http-localhost%2F127.0.0.1-8080-1] DEBUG api.TestController after service
答案 0 :(得分:2)
7到13毫秒几乎是瞬间完成的。你在浪费时间试图进一步减少这种情况。你肯定还有其他更重要的事情要做吗?
即使这是你最紧迫的问题,花时间在它上似乎也没什么意义,因为你真的无能为力,因为它是Grails / Spring代码(而不是你的代码),而不是服务和控制器之间的执行
答案 1 :(得分:2)
开销可能是由Spring在服务调用周围构建事务上下文引起的(Grails默认,请参阅http://grails.org/doc/2.0.x/guide/services.html#declarativeTransactions)。 如果您的服务不需要(数据库)事务,请确保添加
static transactional = false
在服务中。
如果您确实需要交易并且您正在从控制器进行大量服务调用,则值得将它们移至服务中,以便您处理最少量的事务。 (如果您绝对想将它们保留在控制器中,可以使用事务块在单个事务中执行多个服务调用。)