尝试在 MySQL 中连接时出现 java.net.ConnectException [重复]

Posted

技术标签:

【中文标题】尝试在 MySQL 中连接时出现 java.net.ConnectException [重复]【英文标题】:java.net.ConnectException when trying to connect in MySQL [duplicate] 【发布时间】:2017-08-24 05:03:04 【问题描述】:

我尝试从 servlet 连接我的数据库 (mysql),但我得到了Connection refused error。我读过类似的问题,如this。然而:

你还没有启动你的服务器。

在我的本地服务器 (Ubuntu server 16.04) 中,安装了 IP 192.168.0.4 MySQL serverMySQL Server 作为命令运行 service mysql status 给出这个输出:

Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2017-03-21 11:50:56 EET; 1 weeks 1 days ago
Main PID: 1209 (mysqld)

您正在尝试连接到错误的 IP/端口。

MySQL 正在监听 3306 端口,命令为netstat -an | grep 3306. 给出以下输出

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

防火墙在您的连接到达您的服务器之前阻止了它。

服务器的防火墙被禁用,如ufw status

Status: inactive

我也禁用了我电脑的防火墙,但它没有解决连接错误。

您的服务器有太多等待接受的挂起连接。

我的服务器是全新安装的,没有任何待处理的连接。

您的服务器没有监听连接。

我运行命令 nmap -sT -O localhost 并得到:

Not shown: 993 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
25/tcp   open  smtp
80/tcp   open  http
110/tcp  open  pop3
143/tcp  open  imap
3306/tcp open  mysql

NETBEANS

我和服务器我们在同一个网络中。我处理与数据库通信的 Java 类包含:

private final String WEBAPP_DB = "jdbc:mysql://192.168.0.4:3306/myDataBase";
private final String JDBC_DRIVER="com.mysql.jdbc.Driver";
private final String USERNAME = "myUserName";
private final String PASSWORD = "myPassWord";

Connection c = null;
PreparedStatement stm = null;

sq = "SELECT * FROM Machines";
try 
    Class.forName(JDBC_DRIVER);
    c = DriverManager.getConnection(WEBAPP_DB, USERNAME, PASSWORD);
    stm = c.prepareStatement(sq);
    ResultSet rs = stm.executeQuery();

    while(rs.next())
        System.out.println("Machine = " + rs.getInt("id"));
    

 catch (SQLException e) 
    e.printStackTrace();
 finally 
    if (stm != null) 
        stm.close();
    
    if (c != null) 
        c.close();
    

我得到的一些错误是

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 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.
...
Caused by: java.net.ConnectException: Connection refused: connect

任何提示可能是什么问题?

【问题讨论】:

您的数据库服务器正在监听本地主机,您使用外部 IP 地址。将jdbc:mysql://192.168.0.4:3306/myDataBase 更改为jdbc:mysql://localhost:3306/myDataBase 【参考方案1】:

如果您尝试远程连接您的 MySql 服务器,问题出在 MySql 服务器网络配置中,它正在侦听 localhost (127.0.0.1):

Proto Recv-Q Send-Q Local Address           Foreign Address         State    
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

应该是:

Proto Recv-Q Send-Q Local Address           Foreign Address         State    
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN

或者至少,不是0.0.0.0,而是您的服务器IP地址(192.168.0.4)。

我建议阅读这个How to Bind to Static IP address in MySQL

另一方面,如果您在本地连接(您的代码在 MySql 服务器上执行,它与运行 NetBeans 的机器相同)您应该将连接字符串更改为 jdbc:mysql://localhost:3306/myDataBase


附:因此,在恢复您的问卷调查时:)

您正在尝试连接到错误的 IP。

【讨论】:

感谢您提供的所有信息!我没有在本地连接,所以我必须找到如何更改 MySQL 正在监听的位置.. 只需编辑my.cfg 文件并编辑bind-address = 0.0.0.0 - 阅读How to Bind to Static IP address in MySQL 谢谢!在Ubuntu 16.04 中,文件位于/etc/mysql/mysql.conf.d/mysqld.cnf @yaylitzis 很棒 ;)

以上是关于尝试在 MySQL 中连接时出现 java.net.ConnectException [重复]的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过 servlet 连接 mySql 时出现“java.lang.ClassNotFoundException”

MySQL 7.0.6-IR3 版本尝试连接数据库时出现问题

Spring Boot,Java,Docker Compose,尝试在两个容器(mysql,my-api)之间建立连接时出现“连接被拒绝”

使用 JDBC 获取与 MySQL 的连接时出现“连接过多”

使用 Flask 方法访问 MySQL 连接时出现问题

尝试使用用户输入删除时出现 Python 连接器错误