Grails 2 app移植到Grails 3 - PooledConnection已经关闭,已经解决但不确定原因

时间:2017-05-16 11:17:10

标签: grails

我在执行控制器时遇到“PooledConnection已经关闭”错误,该控制器的方法对dataSource执行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做同样的事情 - 而且我是正确的。

我不明白为什么@Transactional在我认为控制器和服务默认是事务性的时候会有所不同 - 或者在Grails 3中有什么变化?

BTW Burt Beckwith提升了sessionFactory连接的使用,因为这为你提供了一个池化连接

1 个答案:

答案 0 :(得分:0)

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

在Grails 3行中,默认情况下他们删除了自动事务代理,但是你可以通过配置更改将它们带回来 [请参阅application.yml - grails:spring:transactioManagement:proxies:false]

添加了@Transaction(Grails版本),因为它使用了AST转换而不是弹簧代理,在我看来它使它更可靠。由于这个原因,使用AST转换促进了使用代理。 @Transactional AST转换还可以让您更好地控制交易的工作方式。

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

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