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

API standards et tierces Java Discussion :

[JNDI] Problème en cas de perte de connexion


Sujet :

API standards et tierces Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 34
    Points : 34
    Points
    34
    Par défaut [JNDI] Problème en cas de perte de connexion
    Bonjour,

    Dans le cadre d'une application web, j'utilise JNDI avec JOnAS pour accéder à une base de données distante.
    Dans une de mes classes, je récupère la DataSource ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    try {
          InitialContext _context = new InitialContext();
          if (_dataSource == null) {
            _dataSource = (DataSource) _context.lookup(myDataSourcePath);
          _myDbConnectionHandler = new DbConnectionHandler(_dataSource);
          _myDbConnectionHandler.start();
          }
        }
        catch (NamingException e) {}
    ...
    Mon objet DbConnectionHandler me sert à obtenir une connection et à la garder vivante.
    Car j'ai en effet un problème. Lorsque la base distante n'est plus disponible parce que la machine distante est arrêtée (halt) ou que le service mysql est arrêté, tout se passe bien. Par contre, si la machine distante s'arrête violemment (coupure de courant par exemple), JNDI ne semble pas s'en rendre compte et ne provoque pas d'exception si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
          Connection _dbConnection = null;
          _dataSource.setLoginTimeout(1);
          _dbConnection = _dataSource.getConnection();
          _dbConnection.setAutoCommit(true);
          Statement stmt = _dbConnection.createStatement();
          stmt.setQueryTimeout(1);
          ResultSet rs = stmt.executeQuery("select 1");
          rs.close();
          stmt.close();
    ...
    Mon code semble attendre indéfinimment quelque-chose qui ne vient jamais.
    J'ai donc été obligé de construire un système avec un thread s'occupant de fournir des connexions et un thread dont l'unique but est de faire une requête "select 1" dans un délai imparti par le premier thread. J'imagine qu'il y a quelque-chose de beaucoup plus élégant!
    Mon fichier de configuration de la datasource est ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    jdbc.maxconpool=-1
    jdbc.connmaxage=30
    datasource.url=jdbc\:mysql\://10.60.1.31:3306/mybase
    datasource.description=Database used for the web application
    datasource.mapper=rdb.mysql
    jdbc.minconpool=0
    jdbc.connteststmt=SELECT 1
    datasource.username=user
    datasource.name=jndi_mybase
    datasource.classname=org.gjt.mm.mysql.Driver
    datasource.password=password
    datasource.factory=none
    jdbc.connchecklevel=2
    Est-ce que JNDI n'est donc pas capable de détecter une perte aussi brutale de la base distante (ce dont je doute) ou bien ai-je oublié quelque-chose (ce dont je suis sûr)?

  2. #2
    Membre actif Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Points : 239
    Points
    239
    Par défaut
    quelle est la ligne exacte de code qui bloque ?
    En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks")

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 34
    Points : 34
    Points
    34
    Par défaut
    C'est lors du traitement de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ResultSet rs = stmt.executeQuery("select 1");
    que ça attend. Je n'ai jamais attendu pour voir s'il y avait un timeout en réalité. Dans mon applicatif je dois impérativement avoir une réponse de la base en moins de 500ms. Si je n'ai pas de réponse, un mécanisme de sauvegarde par fichier à plat est utilisé.
    Le problème est que comme il n'y a rien qui détecte que la base distante est mise hors service de manière violente (y'a aucun problème sur un shutdown de la machine ou un arrêt normal du service mysql), je n'ai rien qui me permet de déclancher mon mécanisme d'utilisation du fichier à plat.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 34
    Points : 34
    Points
    34
    Par défaut
    Bon, d'après mes diverses investigations, je n'ai d'autre choix que de faire comme j'ai fait.
    La socket étant n'étant pas fermée mais plutôt fracassée, JNDI ne peut pas s'en rendre compte autrement qu'après une longue période d'attente.
    Sujet clos, donc.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Reconnecter un Modem en cas de perte de connexion
    Par tizilfin dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 05/06/2009, 19h30
  2. Problème sockets perte de connexion
    Par jabadao dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 07/11/2007, 15h31
  3. [Forum] Problème de pertes de connexions
    Par Invité dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 8
    Dernier message: 19/03/2007, 17h35
  4. Perte de connexion BD
    Par Sylvain James dans le forum XMLRAD
    Réponses: 2
    Dernier message: 30/10/2003, 10h23
  5. Perte de connexion (bis)
    Par rgarnier dans le forum XMLRAD
    Réponses: 7
    Dernier message: 28/05/2003, 11h14

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