2

我在 couchdb 上使用简单的批量获取和更新。

    int batchSize = 5000;
    String startKey = "";
    List<FrontLineWorker> frontLineWorkers;

    while (true) {
        frontLineWorkers = allFrontLineWorkers.getMsisdnsFrom(startKey, batchSize);

        if (frontLineWorkers.size() < batchSize) break;

        for (FrontLineWorker frontLineWorker : frontLineWorkers) {
            // process record, only updates record
        }

        startKey = frontLineWorkers.get(frontLineWorkers.size() - 1).getMsisdn();
    }

getMsisdnsFrom 是一个沙发查询,它在几次后开始超时。我知道沙发仅在读取完成后才索引视图,但由于我只更新记录,它不应该影响索引。另外由于这是预期用途,获取一组记录,修改并获取下一组,我不希望它超时。

我已经尝试过批处理时间 1000 和 5000。

异常消息是:线程“主”org.ektorp.DbAccessException 中的异常:java.net.SocketTimeoutException:读取超时

编辑:在我将批量大小减少到 100 后它起作用了,但我更喜欢更大的批量大小。

4

2 回答 2

1

java.net.SocketTimeoutException是一个非常低级的异常,听起来您可能只需要增加套接字超时值,以便 Java 等待读取完成。

djc也是对的,所有更新都会导致受影响节点的重新索引,但是您可以通过批量大小为 100 来避免超时这一事实意味着重新索引不会导致严重问题。

问题是批量大小对于您的套接字超时来说太大了,减少第一个或增加第二个。

于 2012-07-17T16:54:52.157 回答
0

更新文档会强制它们被重新索引。

于 2012-07-17T12:27:05.357 回答