无法使用JDBC驱动程序连接到localhost上的MySQL

时间:2018-10-10 01:27:10

标签: java mysql jdbc

我无法连接到在自己的计算机上运行的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()的调用将引发以下堆栈跟踪:

  

线程“主”中的异常   com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:   无法建立与数据库服务器的连接。在   sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)     在   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)     在   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)     在java.lang.reflect.Constructor.newInstance(Constructor.java:423)     在com.mysql.jdbc.Util.handleNewInstance(Util.java:411)处   com.mysql.jdbc.Util.getInstance(Util.java:386)在   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)在   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)在   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)在   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)在   com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2570)     在   com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2306)     在com.mysql.jdbc.ConnectionImpl。(ConnectionImpl.java:839)处   com.mysql.jdbc.JDBC4Connection。(JDBC4Connection.java:49)在   sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)     在   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)     在   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)     在java.lang.reflect.Constructor.newInstance(Constructor.java:423)     在com.mysql.jdbc.Util.handleNewInstance(Util.java:411)处   com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:421)在   com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:350)     在java.sql.DriverManager.getConnection(DriverManager.java:664)在   java.sql.DriverManager.getConnection(DriverManager.java:247)在   tmlSchedule.MySQLAccess.readDataBase(MySQLAccess.java:22)在   tmlSchedule.TmlSchedule.main(TmlSchedule.java:9)由以下原因引起:   java.lang.NullPointerException在   com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding(ConnectionImpl.java:3281)     在com.mysql.jdbc.MysqlIO.sendConnectionAttributes(MysqlIO.java:1940)     在   com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1866)     在com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1252)处   com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2488)     在   com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2521)     ...另外14个

到目前为止我所做的:

  • 确认表名,用户名和密码。我可以使用所有这些变量来登录mysql shell(mysql -u user -p)并运行select&insert命令。
  • 将用户名和密码替换为mysql实例上root用户的登录详细信息。
  • 在Eclipse的Java Build Path菜单中参考mysql-connector-java.jar
  • 通过GUI将mysql添加为受信任的服务,用于Firewalld。
  • 在禁用防火墙的情况下运行代码(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:捆绑版:5.1.25`

$ mysql --version返回:

  

x86_64上适用于Linux的mysql Ver 8.0.12(MySQL社区服务器-GPL)

这表明驱动程序已过期,但是我通过列出的here的yum存储库安装了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)

3 个答案:

答案 0 :(得分:2)

由于多种原因,应用程序可能无法连接到数据库。其中之一未使用正确的驱动程序软件(又名JDBC驱动程序)。

在这种情况下,验证与数据库服务器本身兼容的jdbc驱动程序版本的使用可以解决此问题。

一个人可以从here获得正确的驱动程序软件。

一个人可以从命令提示符下验证MySQL服务器版本:首先,启动一个MySQL客户端,然后在其中使用命令mysql> select version();

答案 1 :(得分:1)

我看不到所提供的代码到底发生了什么,但是,当您构建数据访问对象时,您可能需要考虑以这样的方式构建它:Connection是类的变量,而不是类的方法。

此外,默认情况下,通常情况下,mysql数据库会期望建立安全连接。要删除此默认设置,请查看url变量。

public class DataAccessExample {

private Connection connection;
private final String driverClass = "com.mysql.jdbc.Driver";
private final String url = "jdbc:mysql://localhost:3306/tmlschedule?autoReconnect=true&useSSL=false";
private final String userName = "YOUR USERNAME";
private final String password = "YOUR PASSWORD";

//Consider calling this openConnection();
public void readDataBase() throws ClassNotFoundException, SQLException {
    Class.forName(driverClass);
    connection = DriverManager.getConnection(url, userName, password);
}

//Then have a close connection, this will make your life easier in the future
public void closeConnection() throws SQLException {
    if (connection != null) {
        connection.close();
    }
}

}

要使用此代码:

public static void main(String[] args) {
    DataAccessExample d = new DataAccessExample();

    try {
        d.readDataBase();
        d.closeConnection();
    } catch (ClassNotFoundException | SQLException ex) {
        Logger.getLogger(DataAccessExample.class.getName()).log(Level.SEVERE, null, ex);
    }
}

最后,请确保您的数据库名称拼写正确,并且您的用户名和密码正确。

我希望这会有所帮助。

答案 2 :(得分:1)

如果您的mysql版本是8.x,则驱动程序版本太旧,驱动程序类com.mysql.jdbc.Driver已过时。新的驱动程序类是com.mysql.cj.jdbc.Driver。通过SPI自动注册驱动程序,通常不需要手动加载驱动程序类。 以下代码来自official documentation

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

Connection conn = null;
...
try {
    conn =
       DriverManager.getConnection("jdbc:mysql://localhost/test?" +
                                   "user=minty&password=greatsqldb");

    // Do something with the Connection

    ...
} catch (SQLException ex) {
    // handle any errors
    System.out.println("SQLException: " + ex.getMessage());
    System.out.println("SQLState: " + ex.getSQLState());
    System.out.println("VendorError: " + ex.getErrorCode());
}