302 votes

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Échec de la liaison de communication

J'essaie de faire en sorte que ma base de données parle à mes programmes Java.

Quelqu'un peut-il me donner un exemple de programme rapide et sale utilisant le JDBC ?

Je reçois une erreur plutôt stupéfiante :

Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at SqlTest.main(SqlTest.java:22)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
    ... 12 more
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:218)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293)
    ... 13 more

Contenu du fichier de test :

import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlTest {

    public static void main(String [] args) throws Exception {
        // Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
        // // edit the jdbc url 
        Connection conn = DriverManager.getConnection( 
            "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
        // Statement st = conn.createStatement();
        // ResultSet rs = st.executeQuery( "select * from table" );

        System.out.println("Connected?");
    }
}

28 votes

J'étais un idiot. Le serveur MySQL n'a pas été démarré :( Il a réussi après l'avoir démarré.

0 votes

J'ai changé ma source de données Springboot de url : jdbc:mysql://XXX208465:localhost:3306/orv21_kafka_schema à url : jdbc:mysql://localhost:3306/orv21_kafka_schema. Donc le XXX208465 n'était pas nécessaire, qui est le nom d'hôte de mon ordinateur portable. J'ai installé mysql en local et je l'utilise via la CLI mySQL.

315voto

BalusC Points 498232

Donc, vous avez un

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Échec de la liaison de communication
java.net.ConnectException : Connexion refusée

Je cite cette réponse qui contient également un tutoriel MySQL+JDBC étape par étape :

Si vous obtenez un SQLException: Connection refused o Connection timed out ou une version spécifique de MySQL CommunicationsException: Communications link failure alors cela signifie que le BD n'est pas accessible du tout. Cela peut avoir une ou plusieurs des causes suivantes :

  1. L'adresse IP ou le nom d'hôte dans l'URL JDBC est incorrect.
  2. Le nom d'hôte dans l'URL JDBC n'est pas reconnu par le serveur DNS local.
  3. Le numéro de port est manquant ou incorrect dans l'URL JDBC.
  4. Le serveur DB est en panne.
  5. Le serveur DB n'accepte pas les connexions TCP/IP.
  6. Le serveur de base de données n'a plus de connexions.
  7. Un élément situé entre Java et la base de données bloque les connexions, par exemple un pare-feu ou un proxy.

Pour résoudre l'un ou l'autre, suivez les conseils suivants :

  1. Vérifiez et testez-les avec ping .
  2. Rafraîchir le DNS ou utiliser l'adresse IP dans l'URL JDBC à la place.
  3. Vérifiez-le en fonction de my.cnf de la base de données MySQL.
  4. Démarrez le DB.
  5. Vérifier si mysqld est démarré sans l'option --skip-networking option .
  6. Redémarrez la base de données et corrigez votre code de manière à ce qu'il ferme les connexions dans le temps. finally .
  7. Désactivez le pare-feu et/ou configurez le pare-feu/proxy pour autoriser/transférer le port.

Voir aussi :

4 votes

MAMP/ MAMP Pro définit MAMP_skip-networking_MAMP par défaut. Vous devez désactiver cette ligne dans votre my.cfn.

8 votes

Pas dans ce cas, mais une défaillance de la liaison de communication se produit également lorsque vous utilisez un pool de connexions et que les connexions sont fermées en raison d'une inactivité prolongée. Dans ce cas seulement, il est indiqué "Le dernier paquet a été reçu il y a environ "X" secondes".

0 votes

Les threads du pool de connexion ne devraient-ils pas être maintenus actifs par l'exécution de la requête de validation "select 1" ? Pourquoi seraient-ils fermés par une inactivité prolongée alors que nous avons configuré l'évictor pour qu'il s'exécute à des intervalles de temps plus courts que le timeout du serveur mysql ?

14voto

Dans mon cas, j'ai dû remplacer Localhost par l'adresse IP réelle du serveur de la base de données.

Au lieu de

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://localhost:3306/DBname", "root", "root");

J'avais besoin

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");

0 votes

Sur Dernière mise à jour 4/5/18 : Actuellement, j'utilise MySQL Workbench 6.3. Je suis venu ici pour vérifier la solution mais je l'ai trouvé par moi-même, c'est juste que votre serveur MySQL ne fonctionne pas ou qu'il est arrêté. J'ai redémarré mon serveur et ça a marché comme sur des roulettes.

9 votes

C'est la "meilleure solution", pourquoi ? Quel problème résout-elle, et comment ?

0 votes

Cette solution ne peut pas générer de dataframes

13voto

user1694306 Points 11

J'attrape cette exception lorsque Java n'a plus de tas. Si j'essaie de mettre dans la RAM de nombreux éléments de données, j'attrape d'abord " Panne de la liaison de communication " et suivant " OutOfMemoryError ".

Je l'ai enregistré et j'ai diminué la consommation de mémoire (supprimer 1/2 données) et tout est ok.

8voto

Jesper Points 65733

Jetez un coup d'œil sur le site de Sun Tutoriel JDBC . Il ne s'agit pas spécifiquement de MySQL, mais l'idée de JDBC est qu'il est agnostique vis-à-vis des bases de données - peu importe la base de données que vous utilisez, vous devez simplement utiliser le pilote JDBC et la chaîne de connexion appropriés.

Pour MySQL, vous pouvez téléchargez le pilote JDBC ici . Il se compose d'un fichier JAR que vous devez placer dans votre système d'exploitation. Chemin de classe . Voir le documentation du pilote, qui contient également des exemples d'utilisation.

6voto

Karl Walsh Points 172

Je suis peut-être en train de me tromper, mais votre exception semble indiquer que votre serveur MySQL n'est pas disponible.

Exception dans le thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failureLe dernier paquet envoyé avec succès au serveur date de 0 millisecondes. Le pilote n'a reçu aucun paquet du serveur. à...

Que se passe-t-il si vous essayez (à partir du terminal)

mysql -u username -p

Vous serez invité à saisir le mot de passe associé au nom d'utilisateur. Après avoir donné le bon mot de passe, le client mysql se connecte-t-il ?

Si ce n'est pas le cas, vous devrez peut-être lancer MySQL à partir des Préférences. Vous pouvez également le configurer pour qu'il s'exécute au démarrage.

1 votes

J'utilise MAMP pour faire fonctionner mon serveur MySQL. Cela peut-il poser problème ?

0 votes

Lorsque je me connecte (par l'intermédiaire de Sequal Pro) à mes localhost J'utilise le nom d'utilisateur et le mot de passe corrects et cela fonctionne bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X