Grails ::我讨厌,根本不能unerstand:'没有hibernate会话绑定到当前线程'

ask*_*dev 4 service session grails hibernate quartz-scheduler

一个简单的场景,但让我头撞墙,因为我无法理解这个'没有Hibernate会话绑定到当前线程'.

用例实现:

def records = SomeDomain.list()

//split records into equal size chunks.

def chunks = [][] // <- add records to chunks

//now process each chunk in a different thread

chunks.each { aChunk ->
   Thread.start {
     singletonInjectedService # processs(aChunk)
   }
}
Run Code Online (Sandbox Code Playgroud)

如何在grails中实现这一目标?无论容器是什么,Quartz Job想要处理多个线程中的'记录',或者想要在多个线程中处理'记录'的服务,它只是失败了'没有hibernate会话绑定到当前线程'.

一个合法的用例,但可惜它根本不适合我.

hvg*_*des 13

当您尝试以异步方式管理自己的线程时会发生这种情况.在Web应用程序中,当请求进入时,它由容器在线程中处理.容器/弹簧通常将一些资源绑定到执行线程,即当前的hibernate会话等资源.当您启动自己的线程时,当前线程上的现有资源不会神奇地出现在您的新线程上.

当你管理自己的线程时,会发生奇怪的事情.

也就是说,域类上有一个withTransaction方法,在此处记录:http://grails.org/doc/latest/ref/Domain%20Classes/withTransaction.html, 它应该解决您的问题.

还有一个后台线程插件,在这里看到http://grails.org/BackgroundThread+Plugin声称为你处理hibernate会话问题.

  • 一个小的澄清--withSession允许您访问当前Session或创建一个如果没有一个绑定,但它没有绑定到ThreadLocal,所以GORM调用仍然会失败.withTransaction虽然做到了,所以即使你只是阅读,它也是这种情况的解决方案. (7认同)