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?");
}
}
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
ouConnection timed out
ou unCommunicationsException: 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:
- L'adresse IP ou le nom d'hôte dans l'URL JDBC est incorrect.
- Le nom d'hôte dans l'URL JDBC n'est pas reconnu par le serveur DNS local.
- Le numéro de port est manquant ou incorrect dans l'URL JDBC.
- Le serveur de base de données est en panne.
- Le serveur de base de données n'accepte pas les connexions TCP/IP.
- Le serveur de base de données est à court de connexions.
- 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:
- Vérifiez et testez-les avec
ping
.- Actualisez le DNS ou utilisez plutôt l'adresse IP dans l'URL JDBC.
- Vérifiez-le sur
my.cnf
de la base de données MySQL.- Démarrer la base de données.
- Vérifiez si mysqld est démarré sans le
--skip-networking option
.- Redémarrez la base de données et corrigez le code en conséquence pour qu'il ferme les connexions dans
finally
.- Désactiver le pare-feu et/ou configurer le pare-feu/proxy pour autoriser/transférer le port .
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.
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.
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
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);
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.
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.
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é.
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" );
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!
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.
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
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.
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.
Mon même problème est résolu en suivant les étapes suivantes:
aller à mon.cnf
vi /etc/mysql/my.cnf
modifier son adresse de liaison
"#bind-address = 127.0.0.1"
redémarrer mysql
Sudo /etc/init.d/mysql restart
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é.
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.
Pour Remote Call to Mysql
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
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
Pour la dernière version du pilote JDBC, le JDBC:
jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC'
jdbc.user='theNewUser'
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é ...
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.
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 is
com.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
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é!
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.
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).
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';
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.
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.
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!
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
Relancez-le, le problème a disparu.
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.
J'ai eu le même problème, et voici comment cela a été corrigé:
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.