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

JDBC Java Discussion :

Paramétrer un timeout sur DriverManager.getConnection


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Points : 98
    Points
    98
    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 : 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
     
    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

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    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 : 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
    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;
      }
    }

  3. #3
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    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 : 2 713
    Points : 4 792
    Points
    4 792
    Par défaut
    Et en utilisant le setQueryTimeout sur un Statement ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Points : 98
    Points
    98
    Par défaut
    @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)

  5. #5
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    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 : 2 713
    Points : 4 792
    Points
    4 792
    Par défaut
    Ce doit être un problème de driver car sous Windows quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Points : 98
    Points
    98
    Par défaut
    @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

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 96
    Points : 98
    Points
    98
    Par défaut
    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

  8. #8
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2008
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 382
    Points : 191
    Points
    191
    Par défaut
    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.

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    As-tu essayé la méthode setLoginTimeout de DriverManager ?

Discussions similaires

  1. [VB .NET] Paramétrer timeout sur un WebService
    Par aloisio11 dans le forum Services Web
    Réponses: 2
    Dernier message: 13/07/2010, 09h28
  2. Timeout sur read() avec termios et VTIME
    Par olivier857 dans le forum C
    Réponses: 9
    Dernier message: 05/04/2006, 09h30
  3. Erreur de paramètre avec SQL sur Delphi
    Par ghan77 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/01/2006, 13h30
  4. [Struts] paramétrer le timeout d'une session
    Par babylone7 dans le forum Struts 1
    Réponses: 2
    Dernier message: 18/08/2005, 18h19
  5. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22

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