java - 无法使用 JDBC 驱动程序连接到本地主机上的 MySQL
问题描述
我无法连接到在我自己的机器上运行的 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()
使用以下堆栈跟踪调用throws:
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
- 通过 GUI 为 firewalld添加
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 repo 安装了 MySQL ,我想它会为我提供与数据库匹配的驱动程序。我还尝试通过此处列出的 rpm 包安装 Connector/J 8.0 ,但收到以下消息,这对我来说没有意义:
已经安装了包 mysql-connector-java-1:5.1.25-3.el7.noarch(比 mysql-connector-java-8.0.12-1.el7.noarch 更新)
解决方案
由于多种原因,应用程序可能无法连接到数据库。其中之一是没有使用正确的驱动程序软件(又名 JDBC 驱动程序)。
在这种情况下,验证与数据库服务器本身兼容的 jdbc 驱动程序版本的使用解决了该问题。
可以从这里获得正确的驱动软件。
可以从命令提示符验证 MySQL 服务器版本:首先,启动 MySQL 客户端并从那里使用命令mysql> select version();
推荐阅读
- reactjs - 有什么方法可以知道子组件是否已安装在 React 中
- active-directory - 通过域外的 SAM 帐户名获取 UPN?
- c++ - 如何在 C++ 程序中运行带有参数的 VBS 脚本?
- .net-core - gitlab CI 上的 dotnet pack 或 nuget pack
- jquery - 清除表单上的 jquery 验证图标
- wordpress - Wordpress 联系我们 7 不是代码不起作用
- java - 如何将循环内计算的月薪总结为java中的年薪
- transformation - 如何在 jolt 中执行映射值
- android - Dynamsoft Android SDK 与 okhttp3 冲突
- python - 设置类别轴与值轴相交的值的问题