web-dev-qa-db-fra.com

"com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: échec de la liaison de communication" vers la base de données distante

J'ai essayé de me connecter à ma base de données MySQL distante, mais j'ai échoué et cette erreur s'est produite.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

La confusion est que c'était efficace lorsque j'ai utilisé l'outil MySQL-Front pour connecter la base de données distante, et je peux cingler avec l'adresse IP avec succès. mais quand j'ai utilisé mon code, il a montré l'erreur au bout d'environ dix secondes. 

De plus, lorsque j'ai utilisé un nom d'utilisateur ou un mot de passe incorrect dans mon code, la vérification incorrecte s'est immédiatement révélée erronée. Est-ce que cela prouve que l'installation de la connexion n'est pas un problème?

Voici mon code (il peut fonctionner sur ma base de données localhost): 

public static void main(String[] args) {
        String url = "jdbc:mysql://(IP address):3306/";
        String dbName = "talk";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "talkroot";
        String password = "123456";
        try {
            Class.forName(driver).newInstance();
            Connection conn = DriverManager.getConnection(url + dbName,
                    userName, password);
            System.out.println("connect");
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("end");
    }

Voici l'erreur:

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:1074)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2120)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.Java:723)
    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 Source)
    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:282)
    at Java.sql.DriverManager.getConnection(Unknown Source)
    at Java.sql.DriverManager.getConnection(Unknown Source)
    at com.test.TestMySQL.main(TestMySQL.Java:16)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 21298 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:1074)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.Java:3009)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.Java:2895)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.Java:3438)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.Java:1951)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.Java:2101)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.Java:2548)
    at com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.Java:1802)
    at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.Java:3444)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.Java:2062)
    ... 12 more
Caused by: Java.net.SocketException: Software caused connection abort: recv failed
    at Java.net.SocketInputStream.socketRead0(Native Method)
    at Java.net.SocketInputStream.read(Unknown Source)
    at Java.net.SocketInputStream.read(Unknown Source)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.Java:113)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.Java:160)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.Java:188)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.Java:2452)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.Java:2906)
    ... 20 more

Quelqu'un peut m'aider s'il vous plait?

9
chenupt

Cette exception com.mysql.jdbc.exceptions.jdbc4.CommunicationsException se produit si votre connexion à la base de données est inactive pendant une longue période. Cette connexion inactive retourne vrai sur connection.isClosed (); mais si nous essayons d'exécuter une instruction, alors cette exception sera déclenchée, je vais donc suggérer d'utiliser le pooling de bases de données.

3
Yogesh Funde

Généralement, cette erreur se produit lorsque vous n'utilisez pas le bon numéro de port. Peut être la machine qui travaille sur cette base de données (client'db) a un numéro de port différent. (Ex: 3307). 
Allez dans le gestionnaire de tâches ==> Services ==> et vérifiez s'il existe une autre version de mysql. s'ils utilisent 3306, changez votre port en 3307. 

2
pippi longstocking

mettez à jour votre version de lecteur pour:

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

1
Aleja Chica

Je l'ai résolu en supprimant le numéro de port de l'URL de connexion.

Donc, au lieu d'utiliser une chaîne de connexion comme:

jdbc:mysql://12x.xxx.xxx.xxx:1527/yourdbname

utilisation 

jdbc:mysql://12x.xxx.xxx.xxx/yourdbname

1
sahu

Votre serveur MySQL n'est pas en cours d'exécution. Cochez la même chose dans la page des services du gestionnaire de tâches si vous utilisez Windows.

1
Mahadev Aarathri

vous pouvez essayer de remplacer le fichier jar mysql-connector-Java-version.jar. Certaines personnes mettent à jour le fichier jar de 5.1.10 à 5.1.14, alors cela fonctionne. Je vous souhaite de la chance ..

1
Jingyuan Liu

Vérifiez les choses suivantes:

  • Vérifiez si l'adresse IP/le numéro de port est correct ou non 
  • Envoyez une requête ping au serveur en utilisant "l'adresse IP", ce qui peut indiquer que le serveur est en mode de démarrage/mode d'arrêt
  • Si vous obtenez des objets de connexion du pool de connexions, vérifiez la disponibilité des connexions une fois.

J'espère que cette information aide ...

1
Ram72119

De plus, lorsque j'ai utilisé un nom d'utilisateur ou un mot de passe incorrect dans mon code, la vérification incorrecte s'est immédiatement révélée erronée. Est-ce que cela prouve que l'installation de la connexion n'est pas un problème?

c'est probablement fait localement. donc, cela ne concerne pas pourquoi votre code ne fonctionne pas.

Il semble y avoir plusieurs façons de s'y prendre pour pouvoir essayer plusieurs choses. les gens ont résolu cet échec de lien de différentes manières selon leur propre situation:

Voici quelques solutions:

  • changement d'attribut "bind-address"

Décommentez l'attribut "bind-address" ou remplacez-le par l'une des adresses IP suivantes:

bind-address = "127.0.0.1"

ou

bind-address = "0.0.0.0"

  • en commentant "skip-networking"

S'il y a une ligne "skip-networking" dans votre fichier de configuration MySQL, commentez-la en ajoutant le signe "#" au début de cette ligne.

  • changez "wait_timeout" et "interactive_timeout"

Ajoutez ces lignes au fichier de configuration MySQL:

[wait_timeout] [1] = nombre

interactive_timeout = nombre

connect_timeout = nombre

  • Vérifier les paramètres proxy du système d'exploitation

Assurez-vous que les logiciels anti-feu ou anti-virus ne bloquent pas le service MySQL.

  • change la chaîne de connexion

Vérifiez votre chaîne de requête. votre chaîne de connexion devrait ressembler à ceci:

dbName = "my_database";
dbUserName = "root";
dbPassword = "";
String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";

Assurez-vous de ne pas avoir d'espaces dans votre chaîne. Toute la chaîne de connexion doit être continue sans aucun espace.

Essayez de remplacer "localhost" par votre port, par exemple 127.0.0.1 . Essayez également d’ajouter un numéro de port à votre chaîne de connexion, par exemple:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";

Le port par défaut pour MySQL est 3306.

N'oubliez pas de changer le nom d'utilisateur et mot de passe pour le nom d'utilisateur et mot de passe de votre serveur MySQL.

  • met à jour votre fichier de bibliothèque de pilotes JDK
  • Testez différents JDK et JRE (comme les JDK 6 et 7)
  • ne change pas max_allowed_packet

"[max_allowed_packet] [4]" est une variable dans le fichier de configuration MySQL qui indique la taille maximale de paquet, pas le nombre maximal de paquets. Donc, cela ne va pas aider à résoudre cette erreur.

  • changer la sécurité de Tomcat

remplacez Tomcat6_SECURITY = yes par Tomcat6_SECURITY = no

  • utilise la propriété validationQuery

utilisez validationQuery = "select now ()" pour vous assurer que chaque requête a des réponses

  • Reconnexion automatique

Ajoutez ce code à votre chaîne de connexion:

&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
1
hrk_er

Veuillez mettre à jour votre fichier de configuration mysql dans le fichier /etc/mysql/my.cnf

Par défaut, MySQL n'autorise que les connexions à partir de l'adresse localhost. Le fichier de configuration se trouve généralement dans /etc/mysql/my.cnf

Vous voudrez commenter la ligne bind-address en lui donnant l'aspect suivant:

#bind-address     = 127.0.0.1

Ensuite, vous devrez redémarrer le serveur de base de données:

Sudo /etc/init.d/mysql restart
0
Noyal

Si vous travaillez avec une instance Amazon Ubuntu, vous devez suivre ces étapes:

  1. Vérifier l'instance Amazon
  2. Vérifier le groupe de sécurité de l'instance
  3. Attribuez le service mysql/aura et ajoutez votre machine ip ici ou Fournisseur de services ip .
0
shivamindalkar