Précédent   Forum des professionnels en informatique > Java > Général Java > JDBC
JDBC Forum d'entraide sur l'API JDBC (Java Database Connectivity) et l'accès aux bases de données. Avant de poster -> FAQ JDBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/11/2011, 16h44   #1
Membre du Club
 
Inscription : décembre 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 66
Points : 52
Points : 52
Par défaut Paramétrer un timeout sur DriverManager.getConnection

Bonjour,

Je cherche à détecter quand ma base de données est inaccessible (pb réseau, serveur HS,...).

Bref, quand le DriverManager.getConnection(...) échoue.
Pour cela je fait un DriverManager.setConnection(1) avant mais le temps de réponse est très très loin de la seconde attendue.

Voici mon code de test :
Code :
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
 
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class Test {
 
	public static void main(String[] args) {
		long begin = System.currentTimeMillis();
		DriverManager.setLoginTimeout(1);
		System.out.println("timeout : " + DriverManager.getLoginTimeout());
		try {
			System.out.println("connection productConnection.");
			DriverManager.getConnection(
					"jdbc:mysql://192.168.239.224:3306/productBase", "user",
					"user");
			System.out.println("timeout productConnection.");
		} catch (SQLException e) {
			System.out.println("Echec connection.");
		} finally {
			long end = System.currentTimeMillis();
			float time = ((float) (end - begin)) / 1000f;
			System.out.println("Temps : " + time);
		}
	}
}
Lorsque la base n'est pas accessible j'obtiens les traces suivantes :
timeout : 1
connection productConnection.
Echec connection.
Temps : 189.606

Lorsque la base est accessible j'obtiens les traces suivantes :
timeout : 1
connection productConnection.
timeout productConnection.
Temps : 0.337

J'ai certainement loupé quelque chose quelque part mais je vois pas où. Si vous pouvez m'éclairer...

Merci


S. Combes
stephane.combes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 17h54   #2
Membre du Club
 
Homme Frédéric
Inscription : juin 2011
Messages : 52
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 52
Points : 52
Points : 52
Bonjour,

J'ai eu le même problème que toi.
Comme je n'ai pas trouvé la réponse, j'ai fait quelque chose dans ce style pour contourner le problème :

Code :
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
35
36
 
 
class ConnectionWithTimeout extends Thread {
  public volatile Connection connection = null;
 
  private final String path;
  private final String user;
  private final String passwd;
 
  public ConnectionWithTimeout(String path, String user, String passwd) {
    this.path = path;
    this.user = user;
    this.passwd = passwd;
  }
 
  @Override
  public void run() {
      try {
        connection = DriverManager.getConnection(path, user, passwd);
      }
      catch (SQLException e) {
        System.out.println("Echec connection.");
      }
  }
 
  static public Connection getConnection(String path, String user, String passwd, int timeoutMs) {
    ConnectionWithTimeout connectionWithTimeout = new ConnectionWithTimeout(path, user, passwd);
    connectionWithTimeout.start();
    try {
      connectionWithTimeout.join(timeoutMs);
    }
    catch (InterruptedException e) {
    }
    return connectionWithTimeout.connection;
  }
}
Fred_34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 20h43   #3
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
Et en utilisant le setQueryTimeout sur un Statement ?
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 10h33   #4
Membre du Club
 
Inscription : décembre 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 66
Points : 52
Points : 52
@Fred_34 : Merci pour la méthode de contournement qui fonctionne bien (mais tu dois bien le savoir puisque tu l'utilise)

@Népomucène : Le setQueryTimeout s'utilise sur un Statement. Or, pour déclarer un Statement il faut d'abord avoir la connection et c'est justement ça qui est très long en cas d'échec. Merci quand même pour l'idée.

Pour info j'utilise :
  • mysql : mysql Ver 14.14 Distrib 5.1.54, for debian-linux-gnu (x86_64) using readline 6.2
  • jdbc : mysql-connector-java-5.1.13-bin.jar
  • java : java version "1.6.0_23"
    OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10)
    OpenJDK Client VM (build 20.0-b11, mixed mode, sharing)
stephane.combes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 11h07   #5
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
Ce doit être un problème de driver car sous Windows quand je fais :
Code :
1
2
3
4
5
6
7
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String URL = "jdbc:mysql://SERVEUR:3306/labase";
            Connection conn = DriverManager.getConnection(URL, "root", "motdepasse");
        } catch (Exception ex) {
            System.out.println("c'est raté : " + ex.getCause());
        }
j'ai une exception en 4 secondes
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 13h40   #6
Membre du Club
 
Inscription : décembre 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 66
Points : 52
Points : 52
@Népomucène : Merci pour la piste.
Voici des infos supplémentaires :
Sous windows, avec java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing)

j'obtiens un timeout en une vingtaine de seconde.


Je vais voir du côté de mysql-connector-java car la dernière version est 5.1.18.


Je vous tiens au courant...


S. Combes
stephane.combes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 14h27   #7
Membre du Club
 
Inscription : décembre 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 66
Points : 52
Points : 52
alors j'ai essayé sous Linux (comme le premier essais) avec :
  • jdbc : mysql-connector-java-5.1.18-bin.jar
  • java : java version "1.7.0_147-icedtea"
    OpenJDK Runtime Environment (IcedTea7 2.0) (7~b147-2.0-0ubuntu0.11.10.1)
    OpenJDK Client VM (build 21.0-b17, mixed mode, sharing)

Le temps de réponse est toujours le même. N'ayant pas vraiment le temps de chercher plus loin j'ai mis en place le contournement de Fred_34 qui fonctionne.

P.S. : je ne passe pas le sujet en résolu car j'ai espoir de pouvoir revenir dessus en trouver d'où vient le problème.


S. Combes
stephane.combes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 14h42   #8
Membre habitué
 
Inscription : mai 2008
Messages : 285
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : mai 2008
Messages : 285
Points : 111
Points : 111
Je pense avoir le même problème que vous.
Mais dans le doute j'ai préféré ajouter une nouvelle discussion:
http://www.developpez.net/forums/d11...bout-8-heures/

A savoir que la variable qui bloque la connexion ouverte dans mon cas, s'appelle wait time dans mysql
Dans phpmyadmin accessible dans l'onglet variables:> tout en bas(wait timeout:28 800)// Qui correspond a 8 heures.
peofofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 15h46   #9
Modérateur
 
Avatar de OButterlin
 
Homme
Inscription : novembre 2006
Messages : 5 063
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 5 063
Points : 5 654
Points : 5 654
As-tu essayé la méthode setLoginTimeout de DriverManager ?
OButterlin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h01.


 
 
 
 
Partenaires

Hébergement Web