2012-07-17 39 views
2

我用一個簡單的批處理讀取和更新CouchDB的運行超時。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之後,它工作正常,但我希望批量更大。

回答

0

更新文件,迫使他們重建索引。

1

java.net.SocketTimeoutException是一個非常低級異常,聽起來像是你可能只需要增加套接字超時值,以便Java將等待讀取完成。

djc是正確的也是如此,所有更新都會導致受影響的節點重新索引,但事實證明,你能避免的100批次大小超時意味着重新索引不造成一個顯著的問題。

的問題是,批量大小是你的套接字超時過大,降低第一或增加第二。

+0

是的,我知道,但100是數據庫的一個非常差的大小。我想知道在使用它的過程中是否有錯誤。但似乎這是唯一的選擇。謝謝。 – nutsiepully 2012-07-18 07:03:21