簡體   English   中英

Groovy和Java MongoDB驅動程序批量插入引發異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM