2014-09-03 2 views
1

Couchbase débutant question:inserts multiples dans Couchbase défaut

Je suis en train d'insérer 1 million d'enregistrements dans Couchbase, mais je vois que près de 0,5 millions de disques s'insérés (console d'administration affiche 517365 comme Count article). Aussi, à partir de l'interface graphique d'administration, je ne peux voir que 1000 enregistrements (10 pages de 100 enregistrements chacun)

Je me demande où le reste des enregistrements disparaissent!

1) Quelqu'un peut-il m'aider avec ceci?

2) Quel fichier journal dois-je rechercher pour trouver les erreurs d'échec d'insertion? Je soupçonne Couchbase d'avoir une file d'attente interne. Une fois qu'il est plein, d'autres demandes sont abandonnées. Si oui, alors comment configurer la taille de la file d'attente? PS: J'ai essayé de regarder dans les logs C: \ Program Files \ Couchbase \ Serveur \ var \ lib \ couchbase \ logs, mais je n'ai rien trouvé.

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

vous pouvez enregistrer l'état des opérations? comme 'client.set ('foo', 'bar'). getStatus()' – avsej

+0

Notez que faire ce que @avsej mentionne ici provoquera le bon fonctionnement de votre application car l'appel getStatus() attendra que l'opération se termine afin d'obtenir le code de retour de cette opération. – mikewied

+0

J'ai essayé client.set ('foo', 'bar'). GetStatus(). Mais je reçois le {OperationStatus success = false: Temporary failure} comme statut pour de nombreux enregistrements. Comment puis-je configurer la taille du tampon Couchbase? Je suppose que cela devrait résoudre le problème. – aneez

Répondre

2

L'opération définie dans le Couchbase SDK Java est asynchrone. Cela signifie qu'une fois l'appel renvoyé, il n'y a aucune garantie que vous ayez même envoyé l'opération à Couchbase, car elle n'a peut-être même pas encore été écrite dans le tampon réseau. Pour vous assurer que l'opération est terminée, vous devez appeler la fonction get() sur l'objet (Future) renvoyé par l'API set().

En d'autres termes remplacer cette ligne:

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

avec celui-ci:

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

Cela ne rendra-t-il pas l'appel synchrone? Je suppose qu'il y a des files d'attente que Couchbase utilise. Il serait bon de savoir comment le configurer ou vérifier sa taille par défaut. – aneez

+0

Oh ... Comme c'est un avenir, les appels seront asynchrones, mais il y aura toujours un appel get inutile pour chaque appel mis. Y a-t-il un moyen de l'éviter? – aneez

+0

Dans l'API shutdown(), vous devriez pouvoir définir la valeur "wait for files" sur true. Sinon, vous devrez appeler la fonction get() sur chaque future afin de vous assurer que l'opération est terminée. Une chose que vous pouvez également faire est de mettre tous vos objets Future dans une liste, puis appelez get() sur chacun d'entre eux périodiquement. Dans le code de chargement en bloc, j'écris I file 1000 Futures puis j'appelle get() sur chacun d'entre eux et répète jusqu'à ce que toutes les données soient chargées. – mikewied

0

développiez @ réponse de mikewied, pour vérifier que toutes les 1.000.000 opérations ensemblistes ont terminé sans avoir à appelez .get() explicitement sur chacun (et donc de convertir les appels de async à sync), vous devez ajouter un listener à chaque ensemble qui suit combien de vos les opérations sont terminées.

Il y a un bel exemple de la façon de le faire dans le blog post annonce 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(); 

Vous créez un CountDownLatch, initialisées à combien de documents vous ING set(), puis enregistrer un listener qui est appelé à la fin de chaque ensemble (mais notez que les ensembles sont toujours asynchrones). À la fin, vous appelez ensuite le sur le verrou pour vous assurer que toutes les opérations de jeu sont terminées avant de continuer.

Cette approche est décrite plus en détail dans la section Understanding and Using Asynchronous Operations du Couchbase SDK Java Guide du développeur, avec une syntaxe plus compacte si vous utilisez Java 8.

+0

Notez qu'il est toujours important de vérifier que l'opération a réussi dans le cadre de la fonction onComplete, car l'opération peut être terminée avec un code d'erreur. Par exemple, vous pouvez vérifier: future.getStatus(). IsSuccess() – tom

Questions connexes