【发布时间】: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