java - Couchbase、Java SDK 中更新大量文档的每种方式的优点/缺点是什么?

标签 java couchbase couchbase-sync-gateway

我有时需要一次更新很多文档,10K甚至更多,我在想每种方式的优点/缺点是什么?

我想到了两种方法来做到这一点,我很乐意了解什么是优点/缺点并听取第三种方法。

我正在寻找一种好的批量方法来做到这一点。

方式1,发送到observable以获取所有文档并完成工作:

Observable
            .from(ids)
            .flatMap(new Func1<String, Observable<JsonDocument>>() {
                @Override
                public Observable<JsonDocument> call(String id) {
                    return bucket.async().get(id);
                }
            })
            .map(new Func1<JsonDocument, JsonDocument>() {
                @Override
                public JsonDocument call(JsonDocument original) {
                    // do some change in the document content
                    original.content().put("add", "content");
                    return original;
                }
            })
            .flatMap(new Func1<JsonDocument, Observable<JsonDocument>>() {
                @Override
                public Observable<JsonDocument> call(JsonDocument modified) {
                    return bucket.async().replace(modified);
                }
            }).subscribe();

方式2,在每个文档id上运行并使用async get,然后更改文档异步方式:

for (String id : ids){
        bucket.async()
                .get(id)
                .map(new Func1<JsonDocument, JsonDocument>() {
                    @Override
                    public JsonDocument call(JsonDocument jsonDocument) {
                    // do some change in the document content
                        jsonDocument.content().put("add", "content");
                        return jsonDocument;
                    }
                })
                .flatMap(new Func1<JsonDocument, Observable<JsonDocument>>() {
                    @Override
                    public Observable<JsonDocument> call(JsonDocument modified) {
                        return bucket.async().replace(modified);
                    }
                }).subscribe();
    }

最佳答案

这可以使用一些性能基准测试,但我认为这两种方法都很好,并且性能应该相对接近。

在这两种情况下使用bucket.async()可确保在内部,请求将快速在ringBuffer中排队并发送到服务器。

第三种方法与选项 2 类似,但使用阻塞 API,这肯定会表现更差。

总而言之,选项 1 纯粹是 Rx,尽管 Observable.from 中可能会产生一点开销,但也许它提供了最连贯的可读性,所以我会使用这个。另外,您可以获得单个流和订阅,因此您只需支付一次开销。

关于java - Couchbase、Java SDK 中更新大量文档的每种方式的优点/缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28715924/

相关文章:

java - 使用 BorderLayout 在每行输入一个 JLabel

java - 提交文本之前 Jtextfield 工具提示更新

java - 在 Java 中将 Set<Integer> 转换为 Set<String>

node.js - couchbase 服务器 + couchbase lite + couchbase 同步网关 + nodejs + 树莓派

couchbase - 无法通过sync_gateway连接到远程服务器

ios - Couchbase openIDConnect 认证 ios

java - 使用 Pump StreamHandler 将输出和错误写入日志文件

node.js - Sails.js 的 Couchbase 适配器 "Sails-cbes"- ORM 加载失败

couchbase - 如何获取coauchbase View 中的参数值

Couchbase 同步网关 - 服务器和客户端 API 与存储桶阴影