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)?