2015-02-25 3 views
1

У меня иногда возникает необходимость обновить сразу несколько документов, 10K или даже больше, и я думаю, что является преимуществом/недостатком во всех отношениях?Каково преимущество/недостаток в каждом способе обновления большого количества документов в Couchbase, Java SDK?

Я подумал о двух способах этого сделать, и я с удовольствием пойму, что является преимуществом/недостатком и слышать на третьем пути.

Я ищу хороший пакетный способ для этого.

путь 1, отправить наблюдаемый, чтобы получить все документы и сделать работу:

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, выполняемую в каждом документе идентификаторе и использовать асинхронный получить, а затем изменить документ асинхронного путь:

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

ответ

1

Это может привести к небольшому тестированию производительности, но я думаю, что оба подхода хороши и должны быть относительно близкими по производительности.

Использование bucket.async() в обоих случаях гарантирует, что внутренне запросы будут быстро поставлены в очередь в RingBuffer и запущены на сервер.

Третий способ был бы аналогичен варианту 2, но с блокирующим API, и это определенно будет работать хуже.

В целом, вариант 1 является чисто Rx, и хотя в Observable.from могут возникнуть небольшие накладные расходы, возможно, он обеспечивает наиболее согласованную читаемость, поэтому я бы использовал этот. Кроме того, вы получаете один поток и подписку, поэтому вы платите только накладные расходы.

+0

в варианте 2, когда у меня нет документа, я ожидаю получить нуль, но процесс завершится, что мне делать? –

+1

Вы можете попытаться связать defaultIfEmpty (null) после получения, я думаю –