web-dev-qa-db-fra.com

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

Je travaille à obtenir ma base de données pour parler à mes programmes Java.

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

Je reçois une erreur assez 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?");
    }
}
163
Josh K

Donc, vous avez un 

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: échec de la liaison de communication
Java.net.ConnectException: connexion refusée

Je cite de cette réponse qui contient également un didacticiel pas à pas de MySQL + JDBC:

Si vous obtenez un SQLException: Connection refused ou Connection timed out ou un CommunicationsException: Communications link failure spécifique à MySQL, cela signifie que la base de données n'est pas du tout accessible. 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 de base de données est en panne.
  5. Le serveur de base de données n'accepte pas les connexions TCP/IP.
  6. Le serveur de base de données est à court de connexions.
  7. Quelque chose 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. Actualisez le DNS ou utilisez plutôt l'adresse IP dans l'URL JDBC.
  3. Vérifiez-le sur my.cnf de la base de données MySQL.
  4. Démarrer la base de données.
  5. Vérifiez si mysqld est démarré sans le --skip-networking option.
  6. Redémarrez la base de données et corrigez le code en conséquence pour qu'il ferme les connexions dans finally.
  7. Désactiver le pare-feu et/ou configurer le pare-feu/proxy pour autoriser/transférer le port . 

Voir également:

210
BalusC

J'attrape cette exception quand Java sort du tas. Si j'essaie de mettre dans RAM de nombreux éléments de données, je saisis d'abord " Échec de la liaison de communication " et ensuite " OutOfMemoryError ". 

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

7
user1694306

Cette exception com.mysql.jdbc.exceptions.jdbc4.CommunicationsException se produit si votre connexion à la base de données est inactive depuis longtemps. 

Cette connexion inactive retourne true sur connection.isClosed();, mais si nous essayons d'exécuter une instruction, cette exception sera déclenchée, aussi je suggérerai le pooling de bases de données. 

7
Yogesh Funde

C'est la meilleure solution,

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

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

Remplacement de Localhost à votre adresse IP

6
sureshAngamuthu

J'ai le même problème depuis des heures. J'utilise MAMP Server

Au lieu d'utiliser localhost: [Apache Port], utilisez votre port MySQL.

Vous trouverez ci-dessous le port MySQL par défaut pour le serveur MAMP.

String url = "jdbc:mysql://localhost:8889/db_name";

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);
5

Je me trompe peut-être ici, mais votre exception semble indiquer que votre serveur MySQL n'est pas disponible.

Exception dans le fil "principal" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Echec de la liaison de communication Le dernier paquet envoyé avec succès au serveur était 0 millisecondes. Le pilote n'a reçu aucun paquet du serveur. à...

Que se passe-t-il si vous essayez (depuis le terminal) 

mysql -u username -p

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

Sinon, vous devrez peut-être démarrer MySQL à partir des préférences. Vous pouvez également le configurer pour qu'il s'exécute au démarrage.

5
Karl Walsh

Les réponses précédentes sont appropriées. Mais je voudrais aussi pointer vers un problème plus générique.

J'ai fait face à un problème similaire et la raison était une restriction de réseau de mon entreprise.

Même connexion réussissait lorsque j'étais dans un autre réseau.

3
user3251882

J'ai eu la même erreur parce que j'essayais d'exécuter mon programme sans démarrer le serveur mysql. 

Après avoir démarré le serveur mysql, tout s'est bien passé.

3
rs2012

Téléchargez MySQL-JDBC-Type-4-Treiber (par exemple, 'mysql-connector-Java-5.1.11-bin.jar' depuis 'mysql-connector-Java-5.1.11.Zip') sur Mysql .

Vous devez inclure le fichier jar du pilote pendant la compilation et l'exécution dans votre chemin de classe.

Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url 
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );
3
stacker

Dans mon cas, il s’est avéré que la version de mysql-connector-Java était trop élevée.

Dans ma démo, j'utilise en quelque sorte mysql-connector-Java comme ceci:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.9</version>
</dependency>

Mais dans l'environnement de développement, j'utilise ceci:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.31</version>
</dependency>

Et ma version de MySQL était 5.1.48 (oui, elle est ancienne, juste pour imiter la version du produit). J'ai donc rencontré la même erreur.

Puisque la raison est trouvée, la solution est trouvée aussi. Faites correspondre la version!

3
shellbye

Veuillez mettre à jour votre adresse IP dans le fichier /etc/mysql/my.cnf

bind-address  = <IP_ADDRESS>

Redémarrez le démon mysql et les services mysql.

3
Sreedhar GS

Si vous utilisez le serveur WAMP ou XAMP pour installer la base de données mysql ..__, vous devez alors lancer explicitement mysql autrement, il affichera com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure lors de la connexion à la base

2
xrcwrn

Si vous modifiez votre port, vous obtenez le type d'erreur "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: échec de la liaison de communication" Vérifiez votre numéro de port.

2
Maheshkumar.V

j'ai résolu ce problème facilement, cela a fonctionné pour moi. J'ai eu le même problème "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: échec de la liaison de communication". Dans mon fichier db.properties, j’avais ceci: url: jdbc: mysql: // localhost: 90/myDB, N’a supprimé que l’url du port, ce qui a pour résultat url: jdbc: mysql: // localhost/myDB et que a travaillé pour moi.

2
Dario Castro

Mon même problème est résolu en suivant les étapes suivantes:

  1. aller à mon.cnf

    vi /etc/mysql/my.cnf 

  2. modifier son adresse de liaison

    "#bind-address = 127.0.0.1"

  3. redémarrer mysql

    Sudo /etc/init.d/mysql restart

2
Haimei

Cela m'est arrivé lorsque j'ai changé le port mysql de 3306 à 3307 dans my.ini et les fichiers php.ini, mais après avoir changé les ports (3307-> 3306), tout a bien fonctionné. 

2
MrPencil

Je viens de vivre cela.

Je dois le faire fonctionner en:

static{ // would have to be surrounded by try catch
    Class.forName("com.mysql.jdbc.Driver");   // this will load the class Driver
}

Aussi en obtenant la connexion par:

conn = DriverManager.getConnection(DBURL,<username>,<password>);

au lieu de spécifier les paramètres de connexion 

  Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");

Cordialement.

2
mel3kings

Pour Remote Call to Mysql  

  1. Ajoutez utilisateur distant à Mysql à partir, par exemple, IP = remoteIP:

    mysql -u xxxx -p //local coonection to mysql
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
    //Query OK, 0 rows affected (xx sec)
    mysql> FLUSH PRIVILEGES;
    //Query OK, 0 rows affected
    
  2. Autoriser accès distant à Mysql (par défaut, tous les appels externes ne sont pas autorisés):

    Edit 
    /etc/mysql/mysql.conf.d/mysqld.cnf    or    /etc/mysql/my.cnf
    Change line:  bind-address = 127.0.0.1   to
                  #bind-address = 127.0.0.1
    Restart Mysql: /etc/init.d/mysql restart
    
  3. Pour la dernière version du pilote JDBC, le JDBC:

    jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&amp;useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC'
    jdbc.user='theNewUser'
    
1
Yugerten

Dans mon MacBook, cette erreur n’a été résolue que lors de la réinstallation de la nouvelle version d’Eclipse EE et de la suppression des serveurs locaux tels que xampp mysql for mamp, mais que l’un d’entre eux est utilisé ...

0
m Piroli

Essayez de changer localhost en 127.0.0.1.

L'hôte local serait résolu en ::1. Et MySQL ne peut pas être connecté via IPv6 par défaut.

Et voici la sortie de telnet localhost 3306:

$ telnet localhost 3306
Trying ::1...

Et il n'y a pas de réponse du serveur MySQL.

Bien sûr, assurez-vous que votre serveur MySQL est en cours d'exécution.

0
Haozhe Xie

Il essayait de se connecter à une ancienne version de MySQL ('version', '5.1.73' ); Lorsque vous utilisez une version de pilote plus récente, vous obtenez une erreur qui vous indique d’utiliser le "com.mysql.cj.jdbc.Driver ou même que vous n’aurez pas à spécifier celle que vous utilisez:

Chargement de la classe com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver '. Le conducteur est enregistré automatiquement via SPI et chargement manuel du pilote la classe est généralement inutile.

J'ai changé la déclaration pour utiliser la version 5.1.38 de mysql-connector-Java et, dans le code, j'ai conservé le com.mysql.jdbc.Driver.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.38</version>
</dependency>

Tout a commencé quand j'ai vu l'Ankit Jain's répondre

0
hestellez

Dans mon cas, je devais établir un tunnel ssh vers la base de données distante et tous les paramètres étaient corrects et les tests de connexion avec PhpStorm étaient également réussis. Et aussi le schéma a été chargé, mais pas les données. Au lieu de cela, j'ai eu: 

[08S01] 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.

Aucune des suggestions ci-dessus n'a fonctionné. Pour une raison quelconque, j'ai essayé de résoudre le problème en redémarrant simplement PhpStorm et le tour était joué!

0
Tech Nomad

Mon pare-feu bloquait la post 3307 sur laquelle mon MySQL écoutait. J'ai donc changé de port de 3307 à 3306.Puis je parviens à me connecter à une base de données.

0
Michal Šípek

Je recevais plusieurs erreurs telles que:

  • CommunicationsException: Communications link failure 
  • Java.lang.NullPointerException: Attempt to invoke interface method 'Java.sql.Statement Java.sql.Connection.createStatement()' on a null object reference at.

Je devais ajouter:

  • Dans AndroidManifest.xml, incluez <uses-permission Android:name="Android.permission.INTERNET"/> juste après la balise d'ouverture du manifeste.

  • Ajoutez le pilote JDBC à vos dépendances Gradle (ou Maven).

0
Daniel Segura

Ouvrir le fichier /etc/mysql/my.cnf:change under paramètre from 

bind-address = 127.0.0.1 to bind-address = 192.168.0.3 #this is your local system IP Address,

Exécuter la commande ci-dessous dans mysql pour une adresse IP spécifique->

grant all privileges on dbname.* to dbusername@'192.168.0.3' IDENTIFIED BY 'dbpassword';                      

Si vous souhaitez donner accès à toutes les adresses IP, exécutez la commande ci-dessous:

grant all privileges on dbname.* to dbusername@'%' IDENTIFIED BY 'dbpassword'; 
0
ShivBuyya

Je faisais face au même problème pendant le lancement de ma candidature, 

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.

Le problème était que dans le fichier mysql /etc/mysql/mysql.conf.d/mysqld.cnf , la configuration était comme ça

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address    = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

Comme nous pouvons le voir, cette adresse de liaison pointe sur 127.0.0.1. Ainsi, pour démarrer votre application, une solution simple consiste à utiliser le jdbc: mysql: //127.0.0.1: 3306/pizzeria à la place de jdbc: mysql: // localhost: 3306/pizzeria qui connectera le mysql à l’application ou une autre solution est que vous pouvez vérifier et modifier les configurations de mysql en default.Les deux solutions peuvent fonctionner . travaillera pour vous les gars aussi.

0
Prakhar Agrawal

Cela pourrait être un simple problème de pot. vous utilisez peut-être un ancien mysql-connector-Java-XXX-bin.jar qui n'est pas supporté par votre version actuelle de mysql. J'ai utilisé mysql-connector-Java-5.1.18-bin.jar comme j'utilise mysql 5.5 et ce problème est résolu pour moi.

0
Ankit Jain

Peut-être que vous n'avez pas démarré votre serveur Mysql et Apache. Après avoir lancé le serveur Apache et Mysql à partir de XAMPP Control Panel, la connexion a été établie avec succès.

Bonne chance!

0
shivam gupta

J'ai la même erreur de connexion: le problème que j'ai est que j'ai utilisé MySQL 8.0.15 mais le connecteur Java est 5.x.x.

Vous trouverez ci-dessous commententer code here je l'ai corrigé. 1. téléchargez la version 8.0.15. depuis le référentiel Maven: https://search.maven.org/search?q=g:mysql%20AND%20a:mysql-connector-Java

  1. Dans l'EDI Eclipse, sélectionnez "Bibliothèques référencées" dans l'Explorateur Bouton droit de la souris> Chemin de construction> Configurer le chemin de construction a. supprimez le "mysql-connector-5.x.jar" b. Cliquez sur "Ajouter des fichiers JAR externes ..." et sélectionnez mysql-connector-Java-8.0.15.jar.

Relancez-le, le problème a disparu.

0
Peter Chen

Ce qui a résolu pour moi est de faire 2 choses: 1. Créez un nouvel utilisateur autre que root avec un mot de passe en utilisant les connads suivants:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

2. commenter la ligne d'adresse IP sur mysqld.conf

puis connectez-vous avec un nouveau nom d'utilisateur et mot de passe. ça devrait marcher.

0
Abdul Khalid

J'ai eu le même problème, et voici comment cela a été corrigé:

  1. Mon .jsp appelait des attributs que je n'avais pas encore définis dans le servlet
  2. J'avais deux noms de colonne que je passais dans un objet via ResultSet (getString("columnName")) qui ne correspond pas aux noms de colonne de ma base de données.

Je ne sais pas exactement lequel a résolu le problème, mais cela a fonctionné. Assurez-vous également que vous créez une nouvelle variable Statement et ResultSet pour chaque requête de table.

0
user3427633