【问题标题】:Java MySQL JDBC Driver Exception [duplicate]Java MySQL JDBC驱动程序异常[重复]
【发布时间】:2018-12-07 17:01:25
【问题描述】:

首先我想说声抱歉,因为这个问题被问了十亿次,但我仍然不确定我的错误是什么。

所以我遇到的问题如下:
我尝试使用主机、端口等连接到我的 MySQL 服务器,但出现“连接被拒绝”异常。这通常意味着问题与连接/登录有关,并且意味着它无法连接到 MySQL 服务器。 当我通过 phpMyAdmin 登录该服务器时,我使用的是完全相同的数据。下面是错误和我的源代码,希望大家能告诉我我的错误是什么。

提前致谢。

例外:

The last packet sent successfully to the server was 0 milliseconds ago. The 
driver has not received any packets from the server.
    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:172)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at teabot.database.DatabaseConnection.<init>(DatabaseConnection.java:26)
    at teabot.database.DatabaseHelper.setupDB(DatabaseHelper.java:16)
    at teabot.main.Main.init(Main.java:39)
    at teabot.main.Main.main(Main.java:69)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:59)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:103)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:149)
    at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:165)
    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:92)
    at com.mysql.cj.NativeSession.connect(NativeSession.java:152)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:982)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:852)
    ... 9 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:173)
    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:66)

源代码:

protected DatabaseConnection(String host, int port, String databaseName, String username, String password) {                
    boolean error = false;
    try {
        String url = "jdbc:mysql://" + host + ":" + port + "/" + databaseName;
        this.connection = DriverManager.getConnection(url, username, password);
    } catch (SQLException e) {
        e.printStackTrace();
        Helper.log(2, e.getMessage());
        error = true;
    }
    if (!error) {
        Helper.log(0, "Database is ready.");
    }
}

编辑: 我的问题是我的 MySQL 服务器没有监听该端口,因为当我使用 phpMyAdmin 尝试它时,我忘记了它在同一台机器上运行。

【问题讨论】:

  • 如果您可以使用 PHPMyAdmin 连接,但不能使用 JDBC,那么这可能表明 PHPMyAdmin 正在使用 UNIX 域套接字进行连接,并且 TCP/IP(网络)已禁用或正在使用一个不同的端口。查看链接的副本。

标签: java mysql jdbc


【解决方案1】:

与其说是一个答案,不如说是一种诊断问题的方法:

我通常会尝试使用 telnet 或 putty 之类的工具在相关端口上连接到 MySQL 数据库。如果您无法连接,您就知道问题不在于您的代码,而在于您的网络连接。这就是堆栈跟踪在我看来的样子——一个网络连接问题,而不是其他任何问题。也许是防火墙阻止了端口?

那我用用户名和密码试试 MySQL 连接工具。

可能是连接字符串中缺少一些其他参数。

【讨论】:

  • 试过了,我的 MySQL 服务器没有监听那个端口,这就是问题的原因。
【解决方案2】:

strack 轨道显示 Caused by: java.net.ConnectException: Connection refused: connect,这意味着 mysql 服务器不在您传递的 url 上,或者如果服务器处于活动状态,它不会监听您作为参数传递的 port

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2011-09-10
    相关资源
    最近更新 更多