IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NoSQL Discussion :

[MongoDB] Problème de connexion


Sujet :

NoSQL

  1. #1
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut [MongoDB] Problème de connexion
    Bonsoir
    J'utilise l'API java mais lorsque la connexion échoue je ne parviens pas à le détecter.

    Client = new MongoClient(new MongoClientUri(uri));

    Cela ne génère pas d'exception lorsque l'uri est invalide.

    Si je mets mongodb:user:pwd@localhost:2709
    Alors que user n'a droit qu'à «database», j'ai une exception dans l'as logs. Mais mon code continu. Il manque «/database» la fin de l'uri. Je ne détecte donc pas que la connexion à àéchouée. Et plantera plus tard lorsque il y aura une tentative d'écriture.
    Je voudrais capter l'erreur de connexion.
    Mais il n'y a pas d'exception.

    Comment savoir si la connexion est ok ?


    Merci
    A+

  2. #2
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    bonjour
    pour aider à comprendre mon problème voici mon test
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
       @Test
       public void tester() {
          MongoClientURI uri = new MongoClientURI("mongodb://hermes:pwd@localhost:27017");//
          MongoClient client = new MongoClient(uri);
          MongoDatabase db = client.getDatabase(client.getCredentialsList().get(0).getSource());
          System.err.println(client);
          System.err.println(client.getCredentialsList());
     
       }
    Mon utilisateur n'a droit qu'a la base suivi j'ai donc une trace m'indiquant que la connexion à échouée. mais comme il n'y a pas d'exception (ouverture dans un thread) ma variable db est renseignée
    avec une mauvaise base.
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    [                          main] cluster                        INFO  Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
    [iption='null'}-localhost:27017] cluster                        INFO  Exception in monitor thread while connecting to server localhost:27017
    com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='hermes', source='admin', password=<hidden>, mechanismProperties={}}
    	at com.mongodb.connection.SaslAuthenticator.wrapInMongoSecurityException(SaslAuthenticator.java:157)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:37)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:66)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:44)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:162)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:44)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:99)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:44)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:116)[mongo-java-driver-3.3.0.jar:]
    	at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:116)[mongo-java-driver-3.3.0.jar:]
    	at java.lang.Thread.run(Unknown Source)[:1.8.0_102]
    la variable db.name à pour valeur "admin"
    ensuite bien sur je ne peux rien faire.

    mais je ne sais pas comment indiquer à mon code qu'in l'est pas possible de tenter quoi que ce soit vu que la connexion à échouée.
    à part faire une opération pour rien et capter l'erreur je n'ai pas trouvé comment faire

    merci de votre aide
    A+JYT

  3. #3
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    j'ai trouvé une solution qui est loin de me satisfaire.

    créer un ServerListener pour garder les changement d'état.
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
       public class MongoStatusListener implements ServerListener {
          private ServerDescriptionChangedEvent event;
          private boolean available;
     
          public ServerDescriptionChangedEvent getEvent(){
             return this.event;
          }
     
          public boolean isAvailable(){
             return available;
          }
     
          @Override
          public void serverOpening(ServerOpeningEvent event){
             return;
          }
     
          @Override
          public void serverDescriptionChanged(ServerDescriptionChangedEvent event){
             System.out.println(event);
             if (event.getNewDescription().isOk()) {
                available = true;
             } else {
                available = false;
             }
             this.event = event;
          }
     
          @Override
          public void serverClosed(ServerClosedEvent event){
             return;
          }
     
       }
    puis l'utiliser dans la connexion
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
       public void tester() throws Throwable {
          MongoStatusListener sl = new MongoStatusListener();
          MongoClientOptions.Builder optionsBuilder = new MongoClientOptions.Builder();
          optionsBuilder.addServerListener(sl);
          MongoClientURI uri = new MongoClientURI("mongodb://hermes:pwd@localhost:27017", optionsBuilder);
          MongoClient client = new MongoClient(uri);
          Thread.sleep(500);
          if ( ! sl.isAvailable()) {
             try{
                client.close();
             }finally{
                throw sl.getEvent().getNewDescription().getException();
             }
          }
          MongoDatabase db = client.getDatabase(client.getCredentialsList().get(0).getSource());
          System.out.println(client);
          try {
             db.runCommand(new BasicDBObject("ping", "1"));
          }catch (Exception e) {
             e.printStackTrace();
          }
       }
    ce qui me gène beaucoup dans tout ça c'est de ne pas pouvoir resynchroniser les deux.
    lorsqu'on créer le MongoClient tout se passe dans des threads du coup impossible de capter l'exception.
    avec le listener on capte le changement d'état. mais là encore dans un autre thread.

    en gardant le statut et l'événement on peut obtenir l'information dans le listener. mais le listener est mis à jour de façon asynchrone.
    on ne peut donc pas s'en servir pour contrôler l'avancement du programme.

    j'ai cherché comment synchroniser le prog principal et le listenner sans y parvenir.

    j'ai fini par mettre un sleep(500) en deçà de 100 lorsque la connexion échoue le champs event du listener n'est pas renseigné.
    et on a un null pointer exception.
    entre 100 et 500 c'est lorsque la connexion aboutie qu'on a un problème available n'est pas mis à jour et est donc false. et on a un null pointer exception sur le event.

    il faut donc attendre 1/2 seconde pour savoir si on peut continuer.
    ce n'est franchement pas top. surtout que c'est juste le résultat empirique d'un test sur mon PC. je n'ai aucune garantie que ça fonctionne sur une autre machine.


    j'avoue que je ne comprends absolument pas la philosophie qui ce cache derrière tout ça. comment peut-on développer un client si on ne sais pas quand on est connecté ?

    A+JYT

  4. #4
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    Bonjour

    je relance cette discussion car je n'ai toujours pas de solution.

    Je suis toujours dans la phase d'évaluation des différentes base pour résoudre mon pb de stockage. mongoDB semblait pertinent et n'a à part ce problème et un autre pour lequel je n'ai pas de réponse que de bon côté.

    ce point est rédhibitoire. Si je ne trouve pas comment maitriser la connexion au démarrage je serais contraint d'éliminer cette option.
    Trop risqué.
    vu la popularité de la base je suis étonné de n'avoir aucune réponse. j'imagine bien qu'il dois y avoir des solutions mais mes recherches sur le net sont restée vaines.

    merci de votre aide.
    A+JYT

Discussions similaires

  1. [Première installation] Problème de connexion
    Par sekiryou dans le forum Installation
    Réponses: 2
    Dernier message: 02/03/2004, 19h18
  2. [ Oracle 9ias / 10g] problème de connexion
    Par Boosters dans le forum JDeveloper
    Réponses: 2
    Dernier message: 20/01/2004, 17h23
  3. Problème de connexion au serveur MYSQL
    Par ETOKA dans le forum Outils
    Réponses: 2
    Dernier message: 27/11/2003, 09h28
  4. Réponses: 11
    Dernier message: 13/10/2003, 14h48
  5. problème de connexion 2 PC
    Par guitalca dans le forum Développement
    Réponses: 3
    Dernier message: 22/09/2003, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo