2014-09-03 2 views
1

новичка вопрос Couchbase:Несколько вставок в Couchbase неудовлетворительной

Я пытаюсь вставить 1 миллион записей в couchbase, но я вижу, что почти около 0,5 миллиона записей вставляются (консоль администратора показывает 517365 в качестве товара Count). Кроме того, из графического интерфейса администратора я могу видеть только 1000 записей (по 10 страниц по 100 записей)

Мне интересно, где остальная часть записей исчезает!

1) Может ли кто-нибудь помочь мне с этим?

2) В каком файле журнала я должен искать ошибки с ошибками вставки?

Я подозреваю, что у Couchbase есть внутренняя очередь. Как только он будет заполнен, дальнейшие запросы будут удалены. Если да, то как настроить размер очереди?

PS: Я пробовал смотреть в журналы C: \ Program Files \ Couchbase \ Server \ var \ lib \ couchbase \ logs, но ничего не мог понять.

public class Test { 
    public static void main(String[] args) { 
     ArrayList<URI> nodes = new ArrayList<URI>(); 
     String cbUrl = "http://127.0.0.1:8091/pools"; 
     String dbName = "deafult"; 
     CouchbaseClient client = null; 
     try { 
      nodes.add(URI.create(cbUrl)); 

      client = new CouchbaseClient(nodes, dbName, ""); 

      insertRecords(client); 

      System.out.println("Test Over"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      // client.shutdown(); 
     } 
    } 

    public static void insertRecords(CouchbaseClient client) throws Exception { 
     int num = 1000000; 

     for (int n = 1; n <= num; n++) { 
      System.out.println("Adding: " + n); 
      client.set(n + "", 0, n + ""); 
     } 
    } 
} 
+1

Вы могли войти в состояние операций? например, 'client.set ('foo', 'bar'). getStatus()' – avsej

+0

Обратите внимание, что выполнение описанных здесь @avsej приведет к тому, что ваше приложение будет работать правильно, так как вызов getStatus() будет ждать завершения операции чтобы получить код возврата этой операции. – mikewied

+0

Я пробовал client.set ('foo', 'bar'). GetStatus(). Но я получаю {OperationStatus success = false: Временный сбой} как статус для многих записей. Как настроить размер буфера Couchbase? Думаю, это должно решить проблему. – aneez

ответ

2

Операция набора в Couchbase Java SDK является асинхронной. Это означает, что, как только вызов вернется, нет гарантии, что вы даже отправили операцию в Couchbase, так как она еще не была записана в сетевой буфер. Чтобы убедиться, что операция завершена, вам нужно вызвать функцию get() на объекте (который является Будущим), возвращаемом API set().

Другими словами заменить эту строку:

client.set(n + "", 0, n + ""); 

с этим:

client.set(n + "", 0, n + "").get(); 
+0

Не будет ли это сделать синхронный вызов? Я предполагаю, что есть некоторая Очередь, которую использует Couchbase. Было бы хорошо знать, как настроить его или проверить его размер по умолчанию. – aneez

+0

Ох ... С момента своего будущего, вызовы будут асинхронными, но по-прежнему будет ненужный вызов для каждого заданного вызова. Есть ли способ избежать этого? – aneez

+0

В API shutdown() вы должны установить значение «wait for queues» равным true. В противном случае вам нужно будет вызвать функцию get() в каждом будущем, чтобы убедиться, что операция завершена. Одна вещь, которую вы также можете сделать, - поместить все ваши объекты Future в список, а затем вызвать get() на всех из них периодически. В режиме массовой загрузки я пишу I queue 1000 Futures, затем вызываю get() на всех из них и повторяю до тех пор, пока все данные не будут загружены. – mikewied

0

Чтобы расширить @ mikewied отвечают, чтобы проверить, что все 1,000,000 набор операций завершили без, имеющего в вызовите .get() явно на каждом из них (и, следовательно, преобразуйте вызовы с асинхронной синхронизации на синхронизацию), вы должны добавить слушателя к каждому набору, который отслеживает, сколько из ваших операции завершены.

Там хороший пример того, как сделать это в blog post объявляя Couchbase Java SDK 1.2: -

final CountDownLatch latch = new CountDownLatch(100); 
for (int i = 0; i < 100; i++) { 
    OperationFuture<Boolean> future = client.set("key-" + i, "value"); 
    future.addListener(new OperationCompletionListener() { 
    @Override 
    public void onComplete(OperationFuture<?> future) throws Exception { 
     latch.countDown(); 
    } 
    }); 
} 
latch.await(); 

Вы создаете CountDownLatch, инициализируется, сколько документов вы установите() Ing, а затем зарегистрировать слушатель, который вызывается по завершении каждого набора (но обратите внимание, что все еще асинхронны). В конце вы вызываете await() на защелку, чтобы убедиться, что все заданные операции завершены до продолжения.

Этот подход описан более подробно в Understanding and Using Asynchronous Operations разделе Руководства разработчика Couchbase Java SDK, наряду с более компактным синтаксисом, если вы используете Java 8.

+0

Обратите внимание, что по-прежнему важно проверить, что операция прошла успешно как часть функции onComplete, поскольку операция может быть «завершена» с кодом ошибки. В качестве примера вы можете проверить: future.getStatus(). IsSuccess() – tom

Смежные вопросы