Impossible de se connecter à MySQL à partir de Java: NullPointerException dans la logique de connexion du pilote MySQL




(2)

J'essaie de me connecter à une base de données que j'ai créée avec MySQL dans mon programme Java, mais cela échoue toujours.

Par exemple, voici mon code:

import java.sql.*;

public class Squirrel {
    public static void main(String[] args) {
        String user;
        String password;
        Connection connection;
        Statement statement;
        try {
            Class.forName("com.mysql.jdbc.Driver");

            connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306", user, password);

            statement = connection.createStatement();

            // Other code
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Je suis capable de me connecter à la base de données depuis IntelliJ et j'ai ajouté le mysql-connector-java-5.1.40.jar ajouté au projet, mais chaque fois que mysql-connector-java-5.1.40.jar le programme DriverManager.getConnection() lève ceci:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:918)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2330)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2083)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:806)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:410)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:328)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:678)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229)
    at Squirrel.main(Squirrel.java:12)
Caused by: java.lang.NullPointerException
    at com.mysql.jdbc.ConnectionImpl.getServerCharset(ConnectionImpl.java:2997)
    at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1934)
    at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1863)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1226)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2284)
... 13 more

C'est peut-être parce que vous utilisez une version plus ancienne du pilote MySQL. Vous devriez essayer d'utiliser la dernière version.

Pour obtenir la version la plus récente, vous pouvez consulter https://mvnrepository.com/artifact/mysql/mysql-connector-java

Pour l'instant, la version la plus récente est la 8.0.11. Vous pouvez le télécharger here ou l'ajouter à votre pom.xml :

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

Mettre à jour

À la suite d'une enquête plus poussée, il semble que ce soit à cause d'un changement introduit dans MySQL 8.0.1 :

Le problème que vous avez signalé est lié aux modifications introduites dans MySQL 8.0.1 concernant les jeux de caractères et la prise en charge des classements, le caractère par défaut étant désormais "utf8mb4". Ces modifications ont interrompu la façon dont Connector / J initialise les connexions.

Comme vous le savez, cela a été corrigé dans Connector / J 5.1.41 et je suis sûr que vous avez déjà mis à jour votre bibliothèque.

reference

Comme mentionné ci-dessus, un correctif alternatif à votre problème aurait été d'utiliser 5.1.41 au lieu de 5.1.40 .


Cela ressemble à une incompatibilité de version potentielle ou à un client obsolète. Lorsque vous l'exécutez en dehors de l'EDI, vous pouvez extraire la mauvaise version. Je m'assurerais que le client est sur la dernière version ou similaire à la version utilisée par le serveur.





mysql