以下groovy脚本使用Java MongoDB驱动程序,并尝试使用GPar在单独的线程中运行批量插入。第一个脚本mongobulk1.groovy可以正常运行,但可以在不使用“ BulkWriteOperation”的情况下运行。
为了获得更好的性能,第二个脚本mongobulk2.groovy使用了'BulkWritOperation'功能,但是它引发以下异常:
Caught: java.lang.IllegalStateException: java.lang.IllegalStateException: no operations
java.lang.IllegalStateException: java.lang.IllegalStateException: no operations
at jsr166y.ForkJoinTask.getThrowableException(ForkJoinTask.java:504)
at jsr166y.ForkJoinTask.reportResult(ForkJoinTask.java:567)
at jsr166y.ForkJoinTask.join(ForkJoinTask.java:611)
at jsr166y.ForkJoinPool.invoke(ForkJoinPool.java:1492)
at groovyx.gpars.extra166y.ParallelArrayWithMapping.apply(ParallelArrayWithMapping.java:48)
at groovyx.gpars.extra166y.ParallelArray.apply(ParallelArray.java:329)
at groovyx.gpars.pa.GParsPoolUtilHelper.eachParallelPA(GParsPoolUtilHelper.groovy:192)
at groovyx.gpars.GParsPoolUtil.eachParallel(GParsPoolUtil.java:358)
at Importer$_main_closure1.doCall(mongobulk2.groovy:107)
at groovyx.gpars.GParsPool$_withExistingPool_closure1.doCall(GParsPool.groovy:174)
at groovyx.gpars.GParsPool$_withExistingPool_closure1.doCall(GParsPool.groovy)
at groovyx.gpars.GParsPool.withExistingPool(GParsPool.groovy:173)
at groovyx.gpars.GParsPool$withExistingPool$2.callStatic(Unknown Source)
at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:145)
at groovyx.gpars.GParsPool$withPool$1.callStatic(Unknown Source)
at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:121)
at groovyx.gpars.GParsPool$withPool$0.callStatic(Unknown Source)
at groovyx.gpars.GParsPool.withPool(GParsPool.groovy:100)
at groovyx.gpars.GParsPool$withPool.call(Unknown Source)
at Importer.main(mongobulk2.groovy:106)
Caused by: java.lang.IllegalStateException: no operations
at org.bson.util.Assertions.isTrue(Assertions.java:36)
at com.mongodb.DBCollectionImpl.executeBulkWriteOperation(DBCollectionImpl.java:132)
at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:1663)
at com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:1659)
at com.mongodb.BulkWriteOperation.execute(BulkWriteOperation.java:90)
at Importer.run(mongobulk2.groovy:82)
at Importer$run$2.call(Unknown Source)
at Importer$_main_closure1_closure2.doCall(mongobulk2.groovy:112)
at groovyx.gpars.pa.GParsPoolUtilHelper$_eachParallelPA_closure8.doCall(GParsPoolUtilHelper.groovy:192)
at com.sun.proxy.$Proxy9.op(Unknown Source)
at groovyx.gpars.extra166y.AbstractParallelAnyArray$OUPap.leafApply(AbstractParallelAnyArray.java:640)
at groovyx.gpars.extra166y.PAS$FJOApply.atLeaf(PAS.java:147)
at groovyx.gpars.extra166y.PAS$FJBase.compute(PAS.java:108)
at jsr166y.RecursiveAction.exec(RecursiveAction.java:148)
at jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:305)
at jsr166y.ForkJoinWorkerThread.execTask(ForkJoinWorkerThread.java:575)
at jsr166y.ForkJoinPool.scan(ForkJoinPool.java:755)
at jsr166y.ForkJoinPool.work(ForkJoinPool.java:617)
at jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:369)
任何的想法?
实际上,您的算法是错误的,并且您builder.execute()
在构建器没有要求进行创建(即“无操作”)时触发。
您可以通过在之前添加sysout来检查此内容builder.execute()
:
println "nb request to execute: $builder.requests.size"
BulkWriteResult result = builder.execute()
这是关联的mongo客户端源代码:
Assertions.isTrue("no operations", !writeRequests.isEmpty());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句