在批量插入期间,只有一半的BinaryDocument被插入

时间:2016-03-11 08:41:39

标签: java json serialization couchbase rx-java

我在插入过程中遇到了一个奇怪的问题。我有两种类型的文档--JSON和BinaryDocument。我正在执行限制为批量大小的批量插入操作。

该操作适用于JSON文档。但是,如果我上传,说100个文档,那么在BinaryDocument的情况下只有50个上传。每次只有一半的文档被加载到数据库中。

这是我的JSON文档插入代码:

public void createMultipleCustomerDocuments(String docId, Customer myCust, long numDocs, int batchSize) {

        Gson gson = new GsonBuilder().create();
        JsonObject content = JsonObject.fromJson(gson.toJson(myCust));
        JsonDocument document = JsonDocument.create(docId, content);
        jsonDocuments.add(document);
        documentCounter.incrementAndGet();
        System.out.println("Batch size: " + batchSize + " Document Counter: " + documentCounter.get());
        if(documentCounter.get() >= batchSize){
            System.out.println("Document counter: " + documentCounter.get());
            Observable
            .from(jsonDocuments)
            .flatMap(new Func1<JsonDocument, Observable<JsonDocument>>() {
                public Observable<JsonDocument> call(final JsonDocument docToInsert) {
                    return theBucket.async().upsert(docToInsert);
                }
            })
            .last()
            .toList()
            .toBlocking()
            .single();
            jsonDocuments.clear();
            documentCounter.set(0);
        }


    }

这完全没问题。我插入没问题。

以下是我的BinaryDocument插入的代码:

public void createMultipleCustomerDocuments(final String docId, ByteBuffer myCust, long numDocs, int batchSize) throws BackpressureException, InterruptedException {
        ByteBuf buffer = Unpooled.wrappedBuffer(myCust);
        binaryDocuments.add(buffer);
        documentCounter.incrementAndGet();

        System.out.println("Batch size: " + batchSize + " Document Counter: " + documentCounter.get());

        if(documentCounter.get() >= batchSize){
            System.out.println("Document counter: " + documentCounter.get() + " Binary Document list size: " + binaryDocuments.size());
            Observable
            .from(binaryDocuments)
            .flatMap(new Func1<ByteBuf, Observable<BinaryDocument>>() {
                public Observable<BinaryDocument> call(final ByteBuf docToInsert) {
                    //docToInsert.retain();

                    return theBucket.async().upsert(BinaryDocument.create(docId, docToInsert));

                } 
            })
            .last()
            .toList()
            .toBlocking()
            .single();

            binaryDocuments.clear();

            documentCounter.set(0);
        }
     }

这失败了。插入的文档数量正好一半。即使数字的打印方式与JSON文档的函数数字完全相同。 documentCounter显示正确的数字。但是插入数据库的文档数量只是它显示的一半。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

您似乎使用相同的文档ID(即批次的最后一个成员的docId)来创建同一批次中的所有文档

.BinaryDocument.create(docId, docToInsert)

您应该在if语句之外构建BinaryDocument数组(就像使用JsonDocument版本一样)。像

这样的东西
public void createMultipleCustomerDocuments(final String docId, ByteBuffer myCust, int batchSize) throws BackpressureException, InterruptedException {
    //  numDocs is redundant
    ByteBuf buffer = Unpooled.wrappedBuffer(myCust);
    binaryDocuments.add(BinaryDocument.create(docId, buffer)); // ArrayList<BinaryDocument> type
    documentCounter.incrementAndGet();

    System.out.println("Batch size: " + batchSize + " Document Counter: " + documentCounter.get());

    if(documentCounter.get() >= batchSize){
        System.out.println("Document counter: " + documentCounter.get() + " Binary Document list size: " + binaryDocuments.size());
        Observable
        .from(binaryDocuments)
        .flatMap(new Func1<BinaryDocument, Observable<BinaryDocument>>() {
            public Observable<BinaryDocument> call(final BinaryDocument docToInsert) {
                return theBucket.async().upsert(docToInsert);
            } 
        })
        .last()
        .toBlocking()
        .single();
        binaryDocuments.clear();
        documentCounter.set(0);
    }
}

应该有用。

相关问题