我在执行控制器时遇到“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连接的使用,因为这为你提供了一个池化连接
答案 0 :(得分:0)
在Grails 3行中,默认情况下他们删除了自动事务代理,但是你可以通过配置更改将它们带回来 [请参阅application.yml - grails:spring:transactioManagement:proxies:false]
添加了@Transaction(Grails版本),因为它使用了AST转换而不是弹簧代理,在我看来它使它更可靠。由于这个原因,使用AST转换促进了使用代理。 @Transactional AST转换还可以让您更好地控制交易的工作方式。
即使它在示例中显示,我也不会在控制器中使用@Transactional,因为它被认为是不好的做法。
您的业务逻辑应该在服务中 - 控制器应该只用于路由和呈现。