[英]Groovy & Java MongoDB Driver bulk insertion throws exception
以下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()
)。
您可以通過在builder.execute()
之前添加sysout來進行檢查:
println "nb request to execute: $builder.requests.size"
BulkWriteResult result = builder.execute()
這是關聯的mongo客戶端源代碼:
Assertions.isTrue("no operations", !writeRequests.isEmpty());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.