【问题标题】:Grails Service Calls From TagLib Overhead来自 TagLib 开销的 Grails 服务调用
【发布时间】:2013-07-23 04:40:00
【问题描述】:

我有一个非常简单的 taglib 和服务:

class TestTagLib {
    FooService fooService

    static namespace = "bar"

    def test = {
        out << "text"
    }
}

class FooService {
    //This is an empty method that does absolutely nothing
    void foo() { }
}

如果我在一个页面上重复这个标签库 20 次,它会立即执行。但现在如果调用该服务:

...

fooService.foo()
out << "test"

...

突然之间,这 20 个标签库导致页面加载需要 2 秒。服务调用的开销如此之高,这似乎不太正确……或者是吗?我什至该如何调试呢?

【问题讨论】:

  • 我想这取决于你在 foo() 中所做的事情 :-)
  • 正如我在示例中所说,它实际上什么也没做。这是一个空方法。

标签: grails service taglib overhead method-call


【解决方案1】:

服务方法默认是事务性的。因此,对于fooService.foo() 的每次调用,您都会获得创建和提交完整数据库事务的开销。

【讨论】:

  • 在这种情况下,您如何将方法设为事务性只读或根本不具有事务性?
  • 我最终将 static transactional = false 放在没有插入/删除的服务上,如果我在方法级别需要它,我使用 @Transactional(propagation=Propagation.NEVER) (将传播设置为你的任何需要,这里是javadoc static.springsource.org/spring/docs/3.0.x/javadoc-api/org/…)。这就像一个魅力。谢谢!
  • 我倾向于尽可能多地使用注解。它还允许将某些方法标记为只读。然后休眠可以做出更智能的优化决策。
猜你喜欢
  • 1970-01-01
  • 2013-06-11
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
相关资源
最近更新 更多