我在 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 是沙发查询,几次后开始超时。我知道 couch 仅在读取完成时索引 View ,但由于我只更新记录,因此它不应该影响索引。此外,由于这是预期的用途,获取一组记录,修改并获取下一组,我不希望它超时。
我试过批处理时间 1000 和 5000。
异常消息是:线程“main”中的异常 org.ektorp.DbAccessException:java.net.SocketTimeoutException:读取超时
编辑:在我将批量大小减少到 100 后它起作用了,但我更喜欢更大的批量大小。
最佳答案
这个 java.net.SocketTimeoutException
是一个非常低级的异常,听起来您可能只需要增加套接字超时值,以便 Java 等待读取完成。
djc也是正确的,所有更新都会导致受影响节点的重新索引,但是您可以避免批量大小为 100 的超时这一事实意味着重新索引不会导致重大问题。
问题是批量大小对于您的套接字超时来说太大了,减少第一个或增加第二个。
关于java - 在连续更新的批处理中运行时 couchdb 查询超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11516713/