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 :

Connexion java à une BDD MySQL distante via SSH


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Connexion java à une BDD MySQL distante via SSH
    Bonjour,

    J'ai un problème pour me connecter à partir d'un client JAVA à ma BDD MySQL "freez" qui est située sur un serveur distant "emotion" (situé dans un réseau
    universitaire).

    J'utilise donc un client SSH (PuTTY) pour faire un tunnel SSH avec les ports 3306 (MySQL) vers mon serveur (OS = Debian).

    Voici l'équivalent pour Mac et Linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh -N -T -L 3306:emotion:3306 monlogin@res.iut-velizy.uvsq.fr
    MySQL est configuré par défaut pour ne pas accepter les connexions externes, j'ai donc changé cela dans le fichier de configuration de MySQL sur le serveur : /etc/mysql/my.cnf

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bind-address = 127.0.0.1
    est devenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bind-address = 10.0.0.46
    NB : 10.0.0.46 = l'adresse de ma machine sur le réseau universitaire.

    J'ai ensuite changé ,grâce à phpmyadmin, les privilèges de l'utilisateur MySQL "hote" utilisé pour la connexion avec mon client java :
    General :
    Utilisateur = hote
    Serveur = % (tous)
    Mot de passe = Non
    Privilèges = usage
    Grant = Non

    Privilèges spécifiques à une base de données:
    Base = freez
    Droits = SELECT, INSERT, UPDATE, DELETE
    Grant = Non
    Privilèges spécifiques à une table = Non
    Puis j'ai redémarré MySQL grâce à la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /etc/init.d/mysql restart
    Mes identifiants sont valides et j'ai bien compilé en précisant le driver (situé dans le même répertoire que ma classe) dans le classpath :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    >javac -classpath "D:\Documents\Boulot\E-motion\Developpement\Accès aux bdd\mysql-connector-java-5.1.5-bin.jar;." *.java

    Voici le code de mon client JAVA:

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    import java.sql.*;
     
    class connexion
    {
    StringBuffer resultat= new StringBuffer();
    int nCol;
    	public connexion ()
        {
    	envoiRequete();
    	}
     
    	void envoiRequete()
    	{
    	//Connexion
    	try
        {
    	String nomDriver = "com.mysql.jdbc.Driver";
    	Connection conn=null;
    	try
    		{
    		Class.forName(nomDriver); 
    		conn = DriverManager.getConnection("jdbc:mysql://10.0.0.46:3306/freez?","hote","");
    		}
    	catch(ClassNotFoundException cnfe)
    		{
    		System.out.println("La classe "+nomDriver+" n'a pas été trouvée");
    		cnfe.printStackTrace();
    		}
    	//Requete
    	Statement stmt = conn.createStatement();
    	ResultSet rs = stmt.executeQuery("SELECT * from event;");
    	ResultSetMetaData rsmd = rs.getMetaData ();
    	while (rs.next ())
    	    {
    		String tmp= "";
    		for (int i = 1; i <= nCol ; ++i)
    			{
    		    switch (rsmd.getColumnType (i))
    				{
    				case Types.INTEGER:
    				tmp = ""+rs.getInt (i);
    				break;
    			    case Types.CHAR:
    				tmp = ""+rs.getString (i);
    				break;
    				default:
    				System.out.println("Type non implémenté");
    				break;
    				}
    				resultat.append (tmp+"\t");
    			}
    		resultat.append ("\n");
    		}
    	//Affichage du resultat
    	System.out.println(resultat.toString());
    	//Fin de connexion
    	conn.close();
    	}
    	catch (SQLException ex) 
        {
    	System.out.println("Exception: " + ex.toString());
    	ex.printStackTrace() ;
    	}
    	}
     
    	public static void main(String argv[])
        {
          new connexion ();
        }
    }
    J'ouvre alors mon tunnel SSH.

    Quand je lance le programme, l'accès à la base de donnée m'est refusée :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Exception: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
     
    Last packet sent to the server was 0 ms ago.
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
     
    Last packet sent to the server was 0 ms ago.
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
     
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
            at java.lang.reflect.Constructor.newInstance(Unknown Source)
            at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
            at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1
    074)
            at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2104)
            at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:729)
            at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
     
            at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou
    rce)
            at java.lang.reflect.Constructor.newInstance(Unknown Source)
            at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
            at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
            at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java
    :283)
            at java.sql.DriverManager.getConnection(Unknown Source)
            at java.sql.DriverManager.getConnection(Unknown Source)
            at connexion.envoiRequete(connexion.java:22)
            at connexion.<init>(connexion.java:9)
            at connexion.main(connexion.java:68)
    Caused by: java.net.ConnectException: Connection timed out: connect
            at java.net.PlainSocketImpl.socketConnect(Native Method)
            at java.net.PlainSocketImpl.doConnect(Unknown Source)
            at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
            at java.net.PlainSocketImpl.connect(Unknown Source)
            at java.net.SocksSocketImpl.connect(Unknown Source)
            at java.net.Socket.connect(Unknown Source)
            at java.net.Socket.connect(Unknown Source)
            at java.net.Socket.<init>(Unknown Source)
            at java.net.Socket.<init>(Unknown Source)
            at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja
    va:256)
            at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:276)
            at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2027)
            ... 14 more
    Je pense que cela viens du fait que j'utilise un tunnel SSH. Ou alors d'une mauvaise configuration de MySQL.

    J'ai également pensé au firewall qui bloquerais ma connexion, j'ai donc essayé avec un client Linux, mais sans succès.

    Je vous en prie, aidez moi, cela fait 4 jour que je me casse la tête sur ce problème. Je commence sérieusement à perdre espoir...

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par onigami Voir le message
    Bonjour,

    Voici l'équivalent pour Mac et Linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh -N -T -L 3306:emotion:3306 monlogin@res.iut-velizy.uvsq.fr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    Si j'ai bien compris:

    * ton client ssh tourne sur un serveur 10.0.0.46 et ouvre un tunnel
    * ton serveur sql sur emotion, derrière res.iut-velizy.uvsq.fr
    * ton appli java sur ta machine client.

    Première chose, depuis ta machin client, arrive tu à te connecter et faire des requete sur le serveur mysql à travers le tunnel?

    Sinon, essaye de changer ta commande comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh -N -T -L '*:3306:emotion:3306' monlogin@res.iut-velizy.uvsq.fr
    Peut etre que ton client ssh n'écoute de ton coté que sur 127.0.0.1:3306

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Réponse
    C'est bon j'ai enfin résolu le problème!

    J'ai essayé de me connecter avec le programme MySQL Query Browser à travers mon même tunnel. J'ai utilsié les paramètres de connexion
    Host = localhost
    Socket = 3306
    Username = hote
    Et j'était connecté

    Je me suis dit que depuis toutes mes modifs, je n'avais pas réessayé de me connecter avec cette syntaxe dans mon client JAVA conn =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DriverManager.getConnection("jdbc:mysql://localhost:3306/freez?","hote","");
    Et là... c'est plus de 30 heures de suage, petage de plomb qui vient de s'envoler en l'espace de quelques secondes!

    En tout cas merci pour ta réponse J'avais finalement tout bien configuré.

  4. #4
    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
    je rajoute une réponse qui n'est peut etre pas en rapport avec le problème signalé mais qui surement intéressera certains.

    j'obtenais la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
     
    Last packet sent to the server was 0 ms ago.
            at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     
            at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    sur une application multithread elle même répartie sur plusieurs machines
    Une seule des machines levait cette exception. Donc difficile de diagnostiquer quelque chose qui fonctionne bien sur plusieurs serveurs et pas sur un (à configuration logicielle identique). Après recherche j'ai trouvé qu'en limitant le nombre de connexion dans le pool de connexion (de 100 je suis passé à 2) le problème disparaissait. La seule différence c'est que ce serveur était une configuration matérielle plus ancienne.

    Donc pour conclure je pense que ce problème apparait si le temps d'ouverture de la connexion est "trop lent" (je sais c'est pas très scientifique comme affirmation mais c'est en tout cas empirique). J'ai résolu mon problème en positionnant un valeur basse sur le pool de connexion et pas seulement une valeur max.

    Voualou
    En essayant continuellement on finit par réussir. Donc : plus ça rate, plus on a de chance que ça marche. (Jacques Rouxel : "Les shadoks")

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

Discussions similaires

  1. [debutante] Connexion a une bdd mysql en java
    Par ghaza dans le forum JDBC
    Réponses: 4
    Dernier message: 12/05/2010, 08h21
  2. [MySQL] Connexion à une BDD MySQL distante
    Par Rothul dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/11/2007, 22h22
  3. [MySQL] Problème connexion à une BDD Mysql Distante
    Par Marty000 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 17/09/2007, 09h51
  4. Accéder à une base MySQL 'distante' via Python
    Par tse_tilky_moje_imja dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 24/07/2006, 11h49
  5. Connexion sur une base Mysql distante (non locale)
    Par externa dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 20/02/2006, 11h34

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