No se puede conectar a MySQL desde Java: NullPointerException dentro de la lógica de conexión del controlador MySQL
(3)
Estoy tratando de conectarme a una base de datos que creé con MySQL en mi programa Java, pero siempre falla.
Por el bien de ejemplo, aquí está mi código:
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();
}
}
}
}
Puedo conectarme a la base de datos desde IntelliJ y he agregado
mysql-connector-java-5.1.40.jar
agregado al proyecto, pero cada vez que ejecuto el programa
DriverManager.getConnection()
arroja esto:
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
Puede ser porque está utilizando una versión anterior del controlador MySQL. Deberías intentar usar la versión más nueva.
Para obtener la versión más reciente, puede consultar https://mvnrepository.com/artifact/mysql/mysql-connector-java
A partir de ahora, la versión más nueva es 8.0.11.
Puede descargarlo
here
o agregarlo a su
pom.xml
:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
Actualizar
Tras una investigación más profunda, parece que se debe a un cambio que se introdujo en
MySQL 8.0.1
:
El problema que informó está relacionado con los cambios introducidos en MySQL 8.0.1 wrt el soporte de conjuntos de caracteres y colaciones, con la adición de ahora ser ''utf8mb4'' el conjunto de caracteres predeterminado. Tales cambios rompieron la forma en que Connector / J inicializa las conexiones.
Como sabe, esto se solucionó en Connector / J 5.1.41 y estoy seguro de que ya actualizó su biblioteca.
Como se mencionó anteriormente, una solución alternativa a su problema habría sido usar
5.1.41
lugar de
5.1.40
.
Si llama a la dirección IP 127.0.0.1/localhost, entonces se está comunicando con el localhost, en principio, con su propia computadora. Este problema también aparece cuando no tiene localhost configurado
Para sistemas Linux
- Agregue / edite "127.0.0.1 localhost" en / etc / hosts si falta.
Para el sistema de Windows
- Agregue / edite en C: windows / system32 / drivers / etc / hosts si falta.
Suena como un posible desajuste de versión o un cliente desactualizado. Cuando lo ejecutas fuera del IDE, es posible que estés sacando la versión incorrecta. Me aseguraría de que el cliente tenga la última versión o similar a la versión utilizada por el servidor.