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:
Mon objet DbConnectionHandler me sert à obtenir une connection et à la garder vivante.
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) {} ...
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:
Mon code semble attendre indéfinimment quelque-chose qui ne vient jamais.
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(); ...
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:
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)?
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
Partager