Multithreading GPAR、GORM、批量上传
我有一个过程,需要构建一个PDF文档,并将其与正在创建的100多个其他文档相结合 我想多线程这个。我将需要生成PDF并保存到DB的事件列表传递到服务中。文档也保存到目标,路径保存到数据库 所以我使用10个线程的GPAR。我遇到了这样一个问题:当我懒洋洋地提取事件时,会收到一条错误消息 未能延迟初始化角色集合: com.srm.billing.DepositNotice.depositNoticeRevisions,否 届会或届会闭幕;嵌套异常是 org.hibernate.LazyInitializationException:延迟启动失败 初始化角色的集合: com.srm.billing.DepositNotice.depositNoticeRevisions,否 会话或会话已关闭 我注意到有几个网站说Hibernate不是线程安全的,我认为这是造成问题的原因Multithreading GPAR、GORM、批量上传,multithreading,grails,gorm,gpars,Multithreading,Grails,Gorm,Gpars,我有一个过程,需要构建一个PDF文档,并将其与正在创建的100多个其他文档相结合 我想多线程这个。我将需要生成PDF并保存到DB的事件列表传递到服务中。文档也保存到目标,路径保存到数据库 所以我使用10个线程的GPAR。我遇到了这样一个问题:当我懒洋洋地提取事件时,会收到一条错误消息 未能延迟初始化角色集合: com.srm.billing.DepositNotice.depositNoticeRevisions,否 届会或届会闭幕;嵌套异常是 org.hibernate.LazyInitial
GParsPool.withPool( poolSize ) { forkJoinPool ->
depositNotices = pEvents.collectParallel{ event ->
Event.withNewSession{ session ->
return buildDepositNotice( event )
session.flush()
}
}
}
byte[] findlDocument = null
finalDocument = pdfUtilService.concatPDFs( depositNotices )
我看到的结果是,当发生此错误时,先前处理的事件将提交给DB,这是一个问题
我的最终目标是将传递到方法中的事件列表作为单个批处理完成,如果1失败,则不会将任何记录提交给DB 从技术上讲,
collectParallel()
用于无副作用的代码。但你还是可以谨慎地使用它
假设buildDepositNotice(Event)
返回一个保存的域实例,当该实例在事件之外使用时。使用newSession(Closure)
Closure它将被分离。当实例被分离时,您可以访问它的属性等,但是要持久化它,您必须首先将它重新附加到当前会话
要收集存款通知,请确保实例是withNewSession()闭包中计算的最后一个表达式
Event.withNewSession{ session ->
def depositNotice = buildDepositNotice(event)
session.flush()
depositNotice
}
如果pdfUtilService.concatPDFs()这将通过上述例外情况。我必须使用List DepostNotices=DepostNotice.findByEvent(事件),它似乎可以接受并附加到hibernate会话。这似乎很奇怪,通过第一关是可以接受的,但作为一个孩子进入打破冬眠。