Java 在大容量插入期间,仅插入一半的二进制文档

Java 在大容量插入期间,仅插入一半的二进制文档,java,json,serialization,couchbase,rx-java,Java,Json,Serialization,Couchbase,Rx Java,我在插入过程中遇到了一个奇怪的问题。我有两种类型的文档——JSON和BinaryDocument。我正在执行批量插入操作,限制为批量大小 对于JSON文档,该操作运行良好。但是如果我上传,比如说100个文档,那么在BinaryDocument的情况下只有50个得到上传。每次只有一半的文档被加载到数据库中 以下是我插入JSON文档的代码: public void createMultipleCustomerDocuments(String docId, Customer myCust, long

我在插入过程中遇到了一个奇怪的问题。我有两种类型的文档——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);
        }


    }
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);
        }
     }
public void createMultipleCustomerDocuments(字符串docId、客户myCust、长numDocs、int-batchSize){
Gson Gson=new GsonBuilder().create();
jsonobjectcontent=JsonObject.fromJson(gson.toJson(myCust));
JsonDocument document=JsonDocument.create(docId,content);
jsonDocuments.add(文档);
documentCounter.incrementAndGet();
System.out.println(“批大小:+batchSize+”文档计数器:+documentCounter.get());
if(documentCounter.get()>=batchSize){
System.out.println(“文档计数器:+documentCounter.get());
可观察
.来自(jsonDocuments)
.flatMap(新函数1(){
公共可观察调用(最终JsonDocument docToInsert){
返回bucket.async().upsert(docToInsert);
}
})
.last()
托利斯先生()
.toBlocking()
.single();
jsonDocuments.clear();
documentCounter.set(0);
}
}
这完全可以。我在插入方面没有问题

以下是用于插入二进制文档的代码:

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);
        }


    }
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);
        }
     }
public void createMultipleCustomerDocuments(最终字符串docId、ByteBuffer myCust、long numDocs、int batchSize)抛出backpressureeexception、interruptedeexception{
ByteBuf buffer=unmooled.wrappedBuffer(myCust);
添加(缓冲区);
documentCounter.incrementAndGet();
System.out.println(“批大小:+batchSize+”文档计数器:+documentCounter.get());
if(documentCounter.get()>=batchSize){
System.out.println(“文档计数器:“+documentCounter.get()+”二进制文档列表大小:“+binaryDocuments.size()”);
可观察
.from(二进制文件)
.flatMap(新函数1(){
公共可观察呼叫(最终ByteBuf docToInsert){
//docToInsert.retain();
返回bucket.async().upsert(BinaryDocument.create(docId,docToInsert));
} 
})
.last()
托利斯先生()
.toBlocking()
.single();
binaryDocuments.clear();
documentCounter.set(0);
}
}
这是失败的。插入的文档数量正好是一半。甚至数字的打印方式也与JSON文档的函数数字完全相同。documentCounter显示正确的编号。但是插入到数据库中的文档数量只是显示的一半


有人能帮我一下吗?

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

.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);
    }
}
public void createMultipleCustomerDocuments(最终字符串docId、ByteBuffer myCust、int batchSize)抛出backpressureeexception、interruptedeexception{
//numDocs是多余的
ByteBuf buffer=unmooled.wrappedBuffer(myCust);
binaryDocuments.add(BinaryDocument.create(docId,buffer));//数组列表类型
documentCounter.incrementAndGet();
System.out.println(“批大小:+batchSize+”文档计数器:+documentCounter.get());
if(documentCounter.get()>=batchSize){
System.out.println(“文档计数器:“+documentCounter.get()+”二进制文档列表大小:“+binaryDocuments.size()”);
可观察
.from(二进制文件)
.flatMap(新函数1(){
公共可观察调用(最终二进制文档docToInsert){
返回bucket.async().upsert(docToInsert);
} 
})
.last()
.toBlocking()
.single();
binaryDocuments.clear();
documentCounter.set(0);
}
}

应该有效。

如果(documentCounter.get()>=batchSize),那么
if的具体用途是什么{
当没有
else
子句时?@EJP只有当列表的大小等于批的大小时,我才需要将文档推入数据库。否则,我只需要继续在列表中插入文档。关于您的代码,将只插入批的最后一个文档(因为
last
操作符)。是否需要?@dwursteisen,Couchbase文档中给出了批量插入。
last()
将等待在一批中插入它们,直到最后一批完成。参考:向下滚动查看批处理突变。您可以找到文档中的代码。您使用的Couchbase版本是什么?