【发布时间】:2018-10-10 01:27:09
【问题描述】:
我无法连接到在我自己的机器上运行的 MySQL 实例,但我对这种情况的了解不够,无法诊断问题。
public void readDataBase() throws Exception {
Connection connection = null;
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/tmlschedule";
try {
connection = DriverManager.getConnection(url, "user", "pass");
} catch (Exception e) {
throw e;
} finally {
close();
}
}
对.getConnection() 的调用会引发以下堆栈跟踪:
Exception in thread "main"
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
Could not create connection to database server. at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at
com.mysql.jdbc.Util.getInstance(Util.java:386) at
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) at
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) at
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) at
com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2570)
at
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2306)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:839) at
com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49) at
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:421) at
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:350)
at java.sql.DriverManager.getConnection(DriverManager.java:664) at
java.sql.DriverManager.getConnection(DriverManager.java:247) at
tmlSchedule.MySQLAccess.readDataBase(MySQLAccess.java:22) at
tmlSchedule.TmlSchedule.main(TmlSchedule.java:9) Caused by:
java.lang.NullPointerException at
com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding(ConnectionImpl.java:3281)
at com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1940)
at
com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1866)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1252) at
com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2488)
at
com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2521)
... 14 more
到目前为止我做了什么:
- 确认表名、用户名和密码。我可以使用所有这些变量登录到 mysql shell (
mysql -u user -p) 并运行 select & insert 命令。 - 将用户名和密码替换为 mysql 实例上 root 用户的登录详细信息。
- 在 Eclipse 的 Java Build Path 菜单中引用 mysql-connector-java.jar
- 通过用于 firewalld 的 GUI 将
mysql添加为受信任的服务。 - 在禁用防火墙的情况下运行代码 (
sudo systemctl stop firewalld)。这没有任何区别。 - 检查 mysql 是否正在侦听端口 3306。
sudo netstat -tuplen包括以下条目:tcp6 0 0 :::3306 :::* LISTEN 27 113879 7224/mysqld
任何帮助将不胜感激。
编辑:
我在试图弄清楚 MySQL 和驱动程序的版本控制时感到非常困惑。
$ zipgrep 'Bundle-Version' /usr/share/java/mysql-connector-java.jar 返回:
META-INF/MANIFEST.MF:Bundle-Version: 5.1.25`
$ mysql --version 返回:
mysql Ver 8.0.12 for Linux on x86_64 (MySQL Community Server - GPL)
这表明驱动程序已过期,但我通过列出的 yum 存储库 here 安装了 MySQL,我想它会为我提供与数据库匹配的驱动程序。我还尝试通过here 列出的 rpm 包安装 Connector/J 8.0,但我收到以下消息,这对我来说没有意义:
package mysql-connector-java-1:5.1.25-3.el7.noarch(较新 mysql-connector-java-8.0.12-1.el7.noarch) 已经安装了
【问题讨论】:
-
JDBC驱动版本和数据库版本一样吗?
-
您是否能够连接到数据库,例如,从命令提示符处?
-
问题在于带有字符编码的
NullPointerException,如异常跟踪中所示。正如@prasad_ 指出的那样,可能是由于版本不匹配(请参阅stackoverflow.com/questions/46137173/…)。也可以尝试将字符编码附加到连接 url。 -
这是什么?
private Connection connection = null;