【问题标题】:Grails 2 app ported to Grails 3 - PooledConnection has already been closed, solved but not sure why移植到 Grails 3 的 Grails 2 应用程序 - PooledConnection 已关闭,已解决但不确定原因
【发布时间】:2017-05-16 11:17:10
【问题描述】:

在执行控制器时遇到“PooledConnection 已关闭”错误,该控制器的方法对数据源执行 groovy sql 查询,如下所示

class MyController {
    def sessionFactory
    def viewWeek (ThingCommand cmd) {
        def summary = summaryService()
        def db = new Sql(sessionFactory.currentSession.connection())
        def sqlStrFind = "SELECT * FROM mytable"
        def weekList = db.rows(sqlStrFind)
    }
}

在 Grails 2 中,在内联使用 sessionFactory 连接后订购 Service.method 调用时,我看到了运行时问题,但不是上面的顺序。

这促使我尝试将内联代码重构为新服务。这使得代码工作,但我注意到 @Transactional 正在注释新的 Service 类,所以我猜想用 @Transactional 注释类 MyController 可能对 Controller 做同样的事情 - 我是正确的。

我不明白的是,当我认为控制器和服务默认是事务性的——或者在 Grails 3 中做了什么改变时,为什么 @Transactional 会有所作为?

BTW Burt Beckwith 提倡使用 sessionFactory 连接,因为这给了你一个池连接

【问题讨论】:

  • 仅在不在控制器中的服务中使用 .withTransaction 在服务之外的其他地方 - 在控制器中 - 确实应该在服务中

标签: grails


【解决方案1】:

slack grails-community 上的@virtualdogbert 提供了这个答案,它回答了我的问题:

默认情况下,在 Grails 3 行中,他们删除了自动事务代理,但您可以通过更改配置将它们恢复原状 [参见 application.yml - grails: spring: transactioManagement: proxies: false ]

添加@Transaction(Grails 版本)是因为它使用了 AST 转换而不是 spring 代理,在我看来这使它更可靠。出于这个原因,使用 AST 转换被提升为使用代理。 @Transactional AST 转换还可以让您更好地控制事务的工作方式。

即使它显示在示例中,我也不会在控制器中使用 @Transactional,因为它被认为是不好的做法。

您的业务逻辑应该在服务中 - 控制器应该只用于路由和渲染。

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多