Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading GPAR、GORM、批量上传_Multithreading_Grails_Gorm_Gpars - Fatal编程技术网

Multithreading GPAR、GORM、批量上传

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

我有一个过程,需要构建一个PDF文档,并将其与正在创建的100多个其他文档相结合

我想多线程这个。我将需要生成PDF并保存到DB的事件列表传递到服务中。文档也保存到目标,路径保存到数据库

所以我使用10个线程的GPAR。我遇到了这样一个问题:当我懒洋洋地提取事件时,会收到一条错误消息

未能延迟初始化角色集合: com.srm.billing.DepositNotice.depositNoticeRevisions,否 届会或届会闭幕;嵌套异常是 org.hibernate.LazyInitializationException:延迟启动失败 初始化角色的集合: com.srm.billing.DepositNotice.depositNoticeRevisions,否 会话或会话已关闭

我注意到有几个网站说Hibernate不是线程安全的,我认为这是造成问题的原因

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会话。这似乎很奇怪,通过第一关是可以接受的,但作为一个孩子进入打破冬眠。