com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路失败

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

提问人:Josh K 提问时间:6/6/2010 最后编辑:Eric LeschinskiJosh K 更新时间:7/30/2023 访问量:981948

问:

我正在努力让我的数据库与我的 Java 程序对话。

有人可以给我一个使用 JDBC 的快速而肮脏的示例程序吗?

我得到了一个相当惊人的错误:

Exception in thread "main" 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.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:207)
    at SqlTest.main(SqlTest.java:22)
Caused by: 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.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181)
    ... 12 more
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:218)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293)
    ... 13 more

测试文件的内容:

import com.mysql.jdbc.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class SqlTest {

    public static void main(String [] args) throws Exception {
        // Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
        // // edit the jdbc url 
        Connection conn = DriverManager.getConnection( 
            "jdbc:mysql://localhost:3306/projects?user=user1&password=123");
        // Statement st = conn.createStatement();
        // ResultSet rs = st.executeQuery( "select * from table" );

        System.out.println("Connected?");
    }
}
java mysql jdbc

评论

31赞 akfaisel 12/27/2016
我是个傻瓜。MySQL服务器未启动:(启动后成功。
0赞 raikumardipak 8/25/2021
我将Springboot数据源从url:jdbc:mysql://XXX208465:localhost:3306/orv21_kafka_schema更改为url:jdbc:mysql://localhost:3306/orv21_kafka_schema。所以不需要XXX208465,这是我笔记本电脑的主机名。我在本地安装了mysql,并通过mySQL CLI使用它
0赞 Suresh Huse 6/27/2023
我面临同样的问题。在运行“FLUSH HOSTS;”命令时,它再次开始连接服务器。但是我不想要FLUSH HOSTS;而是找到根本原因。有什么线索吗?可能是什么问题?

答:

4赞 stacker 6/6/2010 #1

Mysql 下载 MySQL-JDBC-Type-4-Treiber(即从“mysql-connector-java-5.1.11”.jar“下载”mysql-connector-java-5.1.11-bin.zip)。

您需要在编译和运行时将驱动程序 jar 引入类路径。

Class.forName( "com.mysql.jdbc.Driver" ); // do this in init
// edit the jdbc url 
Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password );
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery( "select * from table" );

评论

0赞 Josh K 6/6/2010
不,给了我一连串关于没有找到任何东西的错误风暴。是否可以在没有 JAR 文件的情况下导入它?
0赞 stacker 6/6/2010
@Josh这可行,您实际上只需要正确设置类路径即可。(或者将 jar 复制到 %JAVA_HOME%\jre\lib\ext 目录中,但这被认为是不好的做法)
6赞 Karl Walsh 6/6/2010 #2

我可能在这里吠错了树,但您的异常似乎表明您的 MySQL 服务器不可用。

线程“main”com.mysql.jdbc.exceptions.jdbc4.CommunicationsException中的异常: 通信链路故障成功发送到服务器的最后一个数据包为 0 毫秒前。驱动程序未从服务器收到任何数据包。在。。。

如果您尝试(从终端)会发生什么

mysql -u username -p

系统将提示您输入与用户名关联的密码。输入正确的密码后,mysql客户端会连接吗?

如果没有,您可能需要从首选项启动MySQL。您也可以将其设置为在启动时运行。

评论

1赞 Josh K 6/7/2010
我正在使用 MAMP 来运行我的 MySQL 服务器。这会是一个问题吗?
0赞 Josh K 6/7/2010
当我(通过 Sequal Pro)连接到我的用户名/密码时,我使用正确的用户名/密码,它工作正常。localhost
325赞 BalusC 6/7/2010 #3

所以,你有一个

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路失败
java.net.ConnectException:连接被拒绝

我引用了这个答案,其中还包含一个分步的MySQL + JDBC教程:

如果您获得特定于 或 或 MySQL 的 ,则意味着根本无法访问数据库。这可能有以下一个或多个原因:SQLException: Connection refusedConnection timed outCommunicationsException: Communications link failure

  1. JDBC URL 中的 IP 地址或主机名错误。
  2. JDBC URL 中的主机名无法被本地 DNS 服务器识别。
  3. JDBC URL 中的端口号缺失或错误。
  4. DB服务器已关闭。
  5. DB Server不接受TCP/IP连接。
  6. DB Server连接已用完。
  7. 介于 Java 和 DB 之间的某些东西正在阻止连接,例如防火墙或代理。

要解决其中一个问题,请遵循以下建议:

  1. 使用 验证和测试它们。ping
  2. 刷新 DNS 或改用 JDBC URL 中的 IP 地址。
  3. 基于MySQL DB进行验证。my.cnf
  4. 启动数据库。
  5. 验证 mysqld 是否在没有 .--skip-networking option
  6. 重新启动数据库并相应地修复您的代码,使其关闭 中的连接。finally
  7. 禁用防火墙和/或配置防火墙/代理以允许/转发端口。

另请参阅:

评论

4赞 Jurik 9/25/2013
MAMP/MAMP Pro 默认设置 MAMP_skip-networking_MAMP。您必须在 my.cfn 中禁用此行
8赞 nikel 12/19/2015
在这种情况下不会,但是当您使用连接池并且连接由于长时间不活动而关闭时,也会发生通信链路故障。只有在那种情况下,它才会说“最后一个数据包是在大约”X“秒前收到的”
0赞 Farhad 9/2/2016
@nikel 连接池中的线程是否不应该通过触发“select 1”验证查询来保持活动状态?当我们将驱逐者设置为以比 mysql 服务器超时更短的时间间隔运行时,为什么它们会因长时间不活动而关闭?
0赞 nikel 9/2/2016
是的,验证查询可以解决此问题。我的观点是关于未设置的情况,并且池中的连接由于不活动而超时
1赞 Big Zed 12/11/2019
我有同样的问题,我通过更改JDBC驱动程序版本解决了它,它工作得很好
4赞 rs2012 4/4/2013 #4

我遇到了同样的错误,因为我试图在不启动mysql服务器的情况下运行我的程序。

启动mysql服务器后,一切正常。

1赞 mel3kings 5/12/2013 #5

刚刚经历过这个。

必须通过以下方式使其工作: (这可以放在静态块初始化器中)

static{ // would have to be surrounded by try catch
    Class.forName("com.mysql.jdbc.Driver");   // this will load the class Driver
}

此外,还可以通过以下方式获取连接:

conn = DriverManager.getConnection(DBURL,<username>,<password>);

而不是指定登录参数

  Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123");

问候。

评论

3赞 user207421 1/21/2017
自 2007 年以来,静态块就不是必需的了,您可以通过任一方式指定登录参数。
13赞 user1694306 5/17/2013 #6

当Java从堆中取出时,我捕捉到了这个异常。如果我尝试在RAM中放入许多数据项 - 首先我会捕获“通信链路故障”,然后是“OutOfMemoryError”。

我记录了它,我减少了内存消耗(删除 1/2 数据),一切正常。

15赞 sureshAngamuthu 3/12/2014 #7

就我而言,我需要将 Localhost 替换为实际的数据库服务器 IP 地址

而不是

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://localhost:3306/DBname", "root", "root");

我需要

 Connection con = DriverManager.getConnection(
 "jdbc:mysql://192.100.0.000:3306/DBname", "root", "root");

评论

0赞 Abhishek Ekaanth 4/6/2018
在最新更新 4 年 5 月 18 日:目前,我正在使用 MySQL Workbench 6.3。我来这里检查解决方案,但我自己找到了它,只是您的MySQL服务器没有运行或已停止。我重新启动了我的服务器,它就像一个魅力。
9赞 user207421 5/10/2018
这是“最佳解决方案”,为什么?它解决了什么问题,如何解决?
0赞 Alan 9/24/2019
此解决方案无法生成数据帧
0赞 user3427633 3/17/2014 #8

我遇到了同样的问题,以下是解决方法:

  1. 我的.jsp正在调用我尚未在 servlet。
  2. 我有两个列名,我通过它们传递到一个对象中,它们与数据库中的列名不匹配。ResultSet (getString("columnName"))

我不确定哪一个解决了问题,但它奏效了。此外,请确保为每个表创建一个新的 和 查询。StatementResultSet

评论

1赞 user207421 5/10/2018
(1)当然不会引起这个问题。
4赞 Sreedhar GS 4/13/2014 #9

请在 /etc/mysql/my.cnf 文件中更新您的 IP 地址

bind-address  = 0.0.0.0

重新启动 mysql deamon 和 mysql 服务。

评论

1赞 OneCricketeer 1/3/2020
编辑以使用有效的绑定地址
3赞 Haimei 6/3/2014 #10

我的相同问题通过以下步骤解决:

  1. 转到my.cnf

    vi /etc/mysql/my.cnf
    
  2. 修改其绑定地址

    "bind-address = 0.0.0.0"
    
  3. 重启MySQL

    sudo /etc/init.d/mysql restart
    
2赞 Ankit Jain 11/4/2014 #11

这可能是一个简单的 jar 问题。可能是您正在使用当前MySQL版本不支持的旧版本。我按我正在使用的方式使用,这个问题为我解决了。mysql-connector-java-XXX-bin.jarmysql-connector-java-5.1.18-bin.jarmysql 5.5

评论

1赞 Kiran Nunna 5/17/2015
是的,罐子不匹配的可能性很大。
0赞 user207421 1/21/2017
所有这些驱动程序版本都应该兼容。
2赞 xrcwrn 11/4/2014 #12

如果您使用 or 服务器来安装 mysql 数据库。 然后,您必须显式启动mysql sever其他明智地,它将在与数据库连接时显示WAMPXAMPcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

2赞 Maheshkumar.V 11/13/2014 #13

如果更改了端口,则会出现此类错误“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路失败” 请检查您的端口号

12赞 Yogesh Funde 2/26/2015 #14

如果数据库连接长时间处于空闲状态,则会发生此异常。com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

这个空闲连接返回 true,但是如果我们尝试执行语句,那么它将触发此异常,因此我建议使用数据库池。connection.isClosed();

评论

2赞 user207421 5/10/2018
它也由于其他原因而发生,例如“连接被拒绝”。
2赞 Dario Castro 4/16/2015 #15

我以一种简单的方式解决了这个问题,这对我有用。我遇到了 seme 问题“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障”。在我的db.properties文件中,我有这个: url:jdbc:mysql://localhost:90/myDB, 只删除了端口 url ,导致这种方式 url:jdbc:mysql://localhost/myDB 对我有用。

8赞 Abdul Rahim Mohamad 4/30/2015 #16

我已经遇到同样的问题好几个小时了。我正在使用 MAMP 服务器

不要使用 localhost:[Apache Port],而是使用 MySQL 端口。

下面是 MAMP 服务器的默认 MySQL 端口。

String url = "jdbc:mysql://localhost:8889/db_name";

Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword);

评论

0赞 DAVIS BENNY 15MIS0426 7/20/2018
如果您在安装 Mysql 之前有 mamp,请尝试此方法
2赞 MrPencil 5/15/2015 #17

当我在 my.ini 和 php.ini 文件中将 mysql 端口从 3306 更改为 3307 时,这种情况发生在我身上,但在将端口 (3307->3306) 改回来后,它又可以正常工作了。

11赞 shellbye 7/2/2015 #18

就我而言,原来是版本太旧了。mysql-connector-java

在我的演示中,我以某种方式使用:mysql-connector-java

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>

但是在开发环境中,我使用这个:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.31</version>
</dependency>

我的MySQL版本是5.1.48(是的,它很旧,只是为了模仿产品版本)。所以我遇到了同样的错误。

既然找到了原因,就找到了解决方案。匹配版本!

评论

5赞 user207421 1/21/2017
不可能。所有这些驱动程序版本都应该向后兼容。
1赞 Nishi 5/5/2019
这个问题似乎在新的 mysql 连接器中得到了修复,请参阅 stackoverflow.com/questions/14559794/...
0赞 edenPan 5/4/2020
我也是一样。驱动程序的版本适用于 MySQL 5,而服务器的版本为 8。所以我更新了罐子的版本,问题解决了。
6赞 user3251882 12/22/2016 #19

较早的答案是合适的。但是,我还想指出一个更通用的问题。

我遇到了类似的问题,原因是我公司的网络限制。

当我在任何其他网络中时,相同的连接都成功了。

评论

1赞 gannu_lee 5/5/2019
这个指针解决了我的问题,当我连接到 VPN 时指定“localhost”正在工作,但如果我断开与 VPN 的连接,同样不起作用,但是我通过将“localhost”更改为“127.0.0.1”来解决这个问题
-1赞 aclowkay 12/28/2016 #20

如果有任何读者在访问远程服务器时遇到此问题:请确保端口已打开

2赞 Haozhe Xie 5/18/2017 #21

尝试更改为 .localhost127.0.0.1

localhost 将解析为 .默认情况下,MySQL无法通过IPv6连接。::1

这是输出:telnet localhost 3306

$ telnet localhost 3306
Trying ::1...

并且MySQL服务器没有响应。

当然,请确保您的MySQL服务器正在运行。

评论

0赞 OneCricketeer 1/3/2020
这实际上是您的 /etc/hosts 文件的问题,而不是 Mysql
0赞 Haozhe Xie 1/4/2020
@cricket_007 默认情况下,localhost 解析为 ::1 而不是 127.0.0.1。
1赞 OneCricketeer 1/4/2020
当然,仅当启用 ipv6 并取决于主机文件时
0赞 shivam gupta 7/24/2017 #22

也许您没有启动 Mysql 和 Apache 服务器。从XAMPP控制面板启动Apache服务器和Mysql后,连接已成功建立。

祝你好运!

0赞 Abdul Khalid 8/16/2017 #23

为我解决的是做两件事: 1. 使用以下连接创建除 root 以外的新用户,并设置一些密码:

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

2. 在mysqld.conf上注释IP地址行

然后使用新的用户名和密码进行连接。它应该起作用。

评论

0赞 OneCricketeer 1/3/2020
您需要对所有远程用户重复此操作,或添加通配符而不是 Localhost
0赞 hestellezg 2/13/2018 #24

它试图连接到旧版本的 MySQL(“版本”、“5.1.73” );当您使用较新的驱动程序版本时,您会收到一个错误,告诉您使用“com.mysql.cj.jdbc.Driver,甚至您不必指定使用哪个版本:

加载类 com.mysql.cj.jdbc.Driver'。驱动程序是 通过SPI自动注册,并手动加载驱动程序 类通常是不必要的。com.mysql.jdbc.Driver'. This is deprecated. The new driver class is

我更改了声明以使用mysql-connector-java的5.1.38版本,并且在代码中保留了com.mysql.jdbc.Driver

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>

当我看到 Ankit Jain 的回答时,一切都开始了

1赞 Michal Sipek 6/7/2018 #25

我的防火墙阻止了我的MySQL监听的3307帖子。所以我把端口从3307改到了3306,然后我就可以成功连接到数据库了。

0赞 m Piroli 10/24/2018 #26

在我的 MacBook 中,我仅在重新安装新版本的 eclipse EE 并删除本地服务器(如 xamp、mysql 或 mamp)时解决了此错误,但仅使用其中之一......

0赞 Prakhar Agrawal 11/3/2018 #27

当我开始申请时,我遇到了同样的问题,

Caused by: 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.

问题是在mysql文件/etc/mysql/mysql.conf.d/mysqld.cnf中,配置是这样的

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address    = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

因此,正如我们所看到的,绑定地址指向 127.0.0.1,因此,对于启动您的应用程序,一个简单的解决方案是我们可以使用 jdbc:mysql://127.0.0.1:3306/pizzeria 而不是 jdbc:mysql://localhost:3306/pizzeria,它将 mysql 连接到应用程序,或者另一种解决方案是您可以检查并将 mysql 配置更改为默认值。这两种解决方案都可以工作。 我希望它也对你们有用。

评论

0赞 OneCricketeer 1/3/2020
无论如何,localhost 都应通过 DNS 解析为 127.0.0.1
1赞 Yugerten 11/8/2018 #28

用于远程调用 mysql

  1. 远程用户添加到 Mysql from for exemple IP=remoteIP :

    mysql -u xxxx -p //local coonection to mysql
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'theNewUser'@'remoteIP' IDENTIFIED BY 'passWord';
    //Query OK, 0 rows affected (xx sec)
    mysql> FLUSH PRIVILEGES;
    //Query OK, 0 rows affected
    
  2. 允许远程访问 Mysql(默认情况下不允许所有外部调用):

    Edit 
    /etc/mysql/mysql.conf.d/mysqld.cnf    or    /etc/mysql/my.cnf
    Change line:  bind-address = 127.0.0.1   to
                  bind-address = 0.0.0.0
    Restart Mysql: /etc/init.d/mysql restart
    
  3. 对于最新版本的 JDBC 驱动程序,JDBC :

    jdbc.url='jdbc:mysql://remoteIP:3306/yourDbInstance?autoReconnect=true&amp;useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC'
    jdbc.user='theNewUser'
    
1赞 Shiv Buyya 11/17/2018 #29

打开文件 /etc/mysql/my.cnf: 将以下参数从

'绑定地址 = 127.0.0.1

bind-address = 0.0.0.0 #this 允许所有系统连接

在mysql中为特定的IP地址>运行以下命令

grant all privileges on dbname.* to dbusername@'192.168.0.3' IDENTIFIED BY 'dbpassword';                      

如果要授予对所有 IP 地址的访问权限,请运行以下命令:

grant all privileges on dbname.* to dbusername@'%' IDENTIFIED BY 'dbpassword'; 
0赞 FullStack Alex 12/23/2018 #30

就我而言,我必须建立到远程数据库的 ssh 隧道,并且所有设置都是正确的,并且测试与 PhpStorm 的连接也成功。并且还加载了架构,但没有加载数据。相反,我得到了:

[08S01] 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.

上述建议均无效。出于任何原因,我试图通过简单地重新启动 PhpStorm 来解决问题,瞧它起作用了!

-2赞 Chase Owens 1/23/2019 #31

此外,您的服务器可能刚刚关闭。在 Mac 上,通过聚光灯导航到 mySQL 首选项面板。在那里,选中该框以在计算机启动时启动服务器并启动服务器。

1赞 10110 2/10/2019 #32

我收到多个错误,例如:

  • CommunicationsException: Communications link failure
  • java.lang.NullPointerException: Attempt to invoke interface method 'java.sql.Statement java.sql.Connection.createStatement()' on a null object reference at.

我不得不补充:

  • 在 AndroidManifest.xml 中,紧跟在开始清单标记之后。<uses-permission android:name="android.permission.INTERNET"/>

  • 将 JDBC 驱动程序添加到 Gradle(或 Maven)依赖项中。

1赞 Peter Chen 3/27/2019 #33

我有同样的连接错误: 我遇到的问题是我使用了 MySQL 8.0.15,但 Java 连接器是 5.x.x。

以下是我如何修复它。 1. 下载 8.0.15.来自 Maven 存储库:https://search.maven.org/search?q=g:mysql%20AND%20a:mysql-connector-java

  1. 在 Eclipse IDE 中,选择资源管理器中的“引用的库” 鼠标右键>构建路径>配置构建路径 a. 删除“mysql-connector-5.x.jar” b. 单击“添加外部 JAR...”并选择mysql-connector-java-8.0.15.jar。

重新运行它,问题就消失了。

评论

0赞 OneCricketeer 1/3/2020
你真的应该使用 Maven 或 Gradle 来管理你的依赖项,而不是 IDE。与不手动将包添加到 Python 路径的方式类似
2赞 Ravinath 9/19/2019 #34
dbhost=jdbc:mysql://172.18.23.100:3306/yourdatabase?useUnicode=yes&characterEncoding=UTF-8&useSSL=false
user=root
password=Password#321

con = DriverManager.getConnection(dbhost, user, password);

如果 MySQL 版本 8 或更高版本用户更新了连接器

评论

1赞 Mohannd 12/31/2019
这是正确的答案,在使用 MySQL 驱动程序 8 或更高版本时,只需将 useSSL=false 添加到连接字符串中即可。
8赞 Sadeq Dousti 11/12/2019 #35

如果Java尝试通过SSL连接到MySQL,但出现问题,也可能发生此错误。(就我而言,我正在将 Payara Server 5.193.1 连接池配置为 MySQL。

有人建议设置.但是,从 Connector/J 版本开始,该设置已弃用。以下是 MySQL Connector/J 8.0 配置属性的摘录:useSSL=false8.0.13

ssl模式

默认情况下,网络连接是 SSL 加密的;此属性允许关闭安全连接,或选择不同的安全级别。允许以下值: - 建立未加密的连接; - (默认)如果服务器启用了加密连接,则建立加密连接,否则回退到未加密的连接; - 如果服务器启用了安全连接,则建立安全连接,否则失败; - 与配置的证书颁发机构 (CA) 证书类似但另外验证服务器 TLS 证书; - 与 类似,但另外验证服务器证书是否与尝试连接的主机匹配。DISABLEDPREFERREDREQUIREDVERIFY_CAREQUIREDVERIFY_IDENTITYVERIFY_CA

此属性替换了已弃用的旧属性 , 和 ,这些属性仍被接受,但转换为 if is not 显式设置的值: 被转换为 ; 被翻译成 ; 被翻译成 ; 被翻译成 。没有等效的旧设置。请注意,对于所有服务器版本,默认设置 是 ,它等同于 、 和 的旧设置 ,在某些情况下,这些设置与 Connector/J 8.0.12 及更早版本的默认设置不同。应检查继续使用旧属性并依赖于其旧默认设置的应用程序。useSSLrequireSSLverifyServerCertificatesslModesslModeuseSSL=falsesslMode=DISABLED{"useSSL=true", "requireSSL=false", "verifyServerCertificate=false"}sslMode=PREFERRED{"useSSL=true", "requireSSL=true", "verifyServerCertificate=false"}sslMode=REQUIRED{"useSSL=true" AND "verifyServerCertificate=true"}sslMode=VERIFY_CAsslMode=VERIFY_IDENTITYsslModePREFERREDuseSSL=truerequireSSL=falseverifyServerCertificate=false

如果显式设置了旧属性,则忽略旧属性。如果未显式设置 OR ,则应用默认设置 。sslModesslModeuseSSLsslMode=PREFERRED

默认值PREFERRED

自版本: 8.0.13

因此,就我而言,设置是我解决问题所需要的一切。 这是在一台测试机器上。但对于生产环境,安全的解决方案是正确配置Java客户端和MySQL服务器以使用SSL。sslMode=DISABLED


请注意,通过禁用 SSL,您可能还必须设置 .(同样,从安全角度来看,这不是一个明智的决定)。MySQL ConnectionString 选项中提供了更多信息:allowPublicKeyRetrieval=true

AllowPublicKeyRetrieval

如果用户帐户使用身份验证,则密码在传输过程中必须受到保护;TLS 是首选机制,但如果它不可用,则将使用 RSA 公钥加密。若要指定服务器的 RSA 公钥,请使用连接字符串设置,或设置为允许客户端自动从服务器请求公钥。请注意,可能允许恶意代理执行 MITM 攻击以获取明文密码,因此默认情况下为 False,必须显式启用。sha256_passwordServerRSAPublicKeyFileAllowPublicKeyRetrieval=TrueAllowPublicKeyRetrieval=True

评论

0赞 Sadeq Dousti 11/12/2019
来自 Payara Server GitHub 的相关线程。
0赞 Michael K 9/7/2023
类似于发生在我身上的事情。几年前,我在MySQL中放置了一个自签名SSL证书,这样我就可以远程安全地与Workbench连接。MySQL、Web 应用程序和所有内容都在同一台服务器上,并使用“localhost”,因此它们不需要 SSL 证书。但是证书过期了,然后没有任何效果。我确实在 Tomcat 日志中看到一条消息 - java.security.cert.CertificateExpiredException: NotAfter: Wed Sep 06 [time] 2023。显然,当证书过期时,Web 应用程序也无法连接。我用一个新的证书修复了。可能在MySQL中禁用SSL也会修复它。
1赞 Ravinath 12/31/2019 #36

样例 jdbc 连接类文件。当您想要获取连接时,只需调用 getConnection 方法即可。包含相关的 mysql-connector.jar

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


public class DBConnection {

    public Connection getConnection() {
        Connection con = null;

        String dbhost;
        String user;
        String password;
// get properties
dbhost="jdbc:mysql://localhost:3306/cardmaildb";
user="root";
password="123";

 System.out.println("S=======db Connecting======");

        try {
            Class.forName("com.mysql.jdbc.Driver");

            con = DriverManager.getConnection(dbhost, user, password);
            //if you are facing with SSl issue please try this 
            //con = DriverManager.getConnection("jdbc:mysql://192.168.23.100:3306/cardmaildb?useUnicode=yes&characterEncoding=UTF-8&useSSL=false",user, password);

        } catch (Exception e) {
            System.err.println("error in connection");
            e.printStackTrace();
        }
        System.out.println("E=======db Connecting======");
        return con;
    }

    public static void main(String[] args) {
        new DBConnection().getConnection();
    }
}
1赞 A.R.K.S 5/9/2020 #37

就我而言,当我尝试从同一主机连接到在 Ubuntu 主机 VM 上的容器内运行的 mysql-server 时,我遇到了此错误。

例: 如果我的 VM 名称是 ,则以下 jdbc URL 将不起作用abc.company.com

jdbc:mysql://abc.company.com:3306/dbname

上面的 jdbc url 可以在其他机器上正常工作,例如但不能。xyz.company.comabc.company.com

其中,以下 jdbc URL 在机器上可以正常工作abc.company.com

jdbc:mysql://localhost:3306/dbname

这导致我检查了文件。/etc/hosts

添加以下行以解决此问题:/etc/hosts

127.0.1.1 abc.company.com abc

这似乎是一个操作系统错误,需要我们在某些 Ubuntu 版本上添加这些错误。 参考: https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_hostname_resolution

在尝试此操作之前,我已经尝试了所有其他解决方案,例如更改mysql.cnf中的行。在这种情况下,他们都没有帮助我。GRANT ALL..bind-address

2赞 Adnan Asghar 8/25/2020 #38

就我而言,结果是mysql-connector-java的版本不同。 我刚刚将mysql jdbc更改为maria jbdc

旧的 jdbc 驱动程序

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>


新的 JDBC 驱动程序

<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>2.6.2</version>
</dependency>

评论

1赞 Joep Weijers 8/25/2020
MariaDB是MySQL的一个分支,但实际上它们是两个不同的数据库。在这种情况下,您建议使用其他 JDBC 驱动程序不是解决方案,这是由于服务器未启动导致的。
1赞 Pedro Queiroga 11/4/2020 #39

这个问题有很多答案,我认为我的答案更适合另一个问题,但这个问题的答案是锁定的。它指向此线程。

为我解决的是将字符串附加到 .&createDatabaseIfNotExist=truespring.datasource.urlapplication.properties

这是非常棘手的,因为它表现为几个不同的、奇怪的、看似无关的错误,当我试图修复它抱怨的内容时,它只会弹出另一个错误,或者错误是无法修复的。它抱怨无法加载 JDBC,说它不在类路径中,但我以大约 30 种不同的方式将其添加到类路径中,并且已经在进行面对面处理。

1赞 Thuan Tran 4/26/2021 #40

我通过降级jdk版本解决了这个问题。 从 11.0.11 降级到 11.0.10 或更早的 java 版本

1赞 Neetesh Kumar Gupta 5/5/2021 #41

我在远程 Jenkins 服务器上运行自动化测试时遇到了这个问题。但是,在本地运行测试时,没有发生任何问题。

对我来说,在将 mysql-connector 版本更新到 POM 文件中的最新版本后,这个问题得到了解决,因为 MySQL 版本在服务器端发生了变化。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.24</version>
</dependency>

但是调试结果有点困难,花了将近两天的时间,因为我不知道MySQL版本更改,而且它在本地工作正常。

评论

1赞 Henry Parker 11/25/2021
你刚刚为我节省了很多调试时间。我遇到了完全相同的情况,从“8.0.16”更新到“8.0.25”修复了它。对mysql连接器开发人员在补丁版本中破坏兼容性感到羞耻。
27赞 Gerard de Visser 6/14/2021 #42

就我而言,解决方案是将预期的 TLS 协议添加到连接字符串中,如下所示:

jdbc:mysql://localhost:3306/database_name?enabledTLSProtocols=TLSv1.2

出于测试/开发目的(不建议用于生产),您还可以尝试:

jdbc:mysql://localhost:3306/database_name?useSSL=false&allowPublicKeyRetrieval=true

评论

1赞 NickBeaugié 7/15/2021
非常感谢!我扯了扯头发,想知道怎么了。我可以使用 MySQL Workbench 进行连接,但不能通过 Java 代码和连接字符串进行连接,这些代码和连接字符串对我认为是相同的 RDS 实例起作用。
0赞 Saran Raj 8/19/2022
任何人都可以解释为什么它通过启用tls协议开始工作:- )
1赞 Pablo Pazos 12/1/2022
这是我的解决方案,我认为问题是我的 Linux 是旧的,我的数据库是新的,所以他们管理不同的最低要求 TLS 协议版本。
1赞 Musfiq Shanta 9/29/2021 #43

此问题是从 xampp 端口创建。首先,您应该确认您的端口号。基本上,每个人都尝试使用 3306,但有时会出错。 你可以试试这个jdbc:mysql://127.0.0.1:3307

1赞 Jackson 1/13/2022 #44

请使用与平台无关的zip或tar,遇到此错误时对我有用。

https://dev.mysql.com/downloads/connector/j/?os=26

评论

0赞 Procrastinator 1/17/2022
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。- 从评论
9赞 user7641341 3/12/2022 #45

添加这个 useSSL=false&allowPublicKeyRetrieval=true

jdbc:mysql://localhost:3306/cloudapp?useSSL=false&allowPublicKeyRetrieval=true

https://youtu.be/ray3YvnIohM

1赞 salam_verdim_alana_panyatkasi 4/3/2022 #46

通常,当您使用的数据库在操作系统中关闭时,会出现此问题。 如果您使用 Windows,请转到服务并确保 MySQL 处于 Starting 位置。

0赞 keesp 4/18/2022 #47

在MySQL Workbench中,可能会发生此问题,尤其是在localhost下使用Eclipse JPA和持久性时。问题在于,正如其他一些答案中提到的,MySQL服务器在创建连接时可能非常限制使用localhost,0.0.0.0.1或127.0.0.1。为了克服这个问题,(对于 Windows)中的 hosts 文件:

C:\Windows\System32\驱动程序\等

需要为主连接(例如myserver)添加以下条目:

#MY 数据库服务器
127.0.0.1 myserver

如果未将其添加到主机,则每次尝试从 127.0.0.1 连接数据库时,连接都将失败

1赞 akib 6/18/2022 #48

就我而言,我在从intellij IDEA运行时遇到此错误,而从终端运行工作正常。然后我发现 Intellij 指向的是我下载的一些。我把它改成OpenJdk,它开始工作正常。./gradlew bootRunliberica java

1赞 Sivaram Rasathurai 7/28/2022 #49

就我而言, 在连接字符串中添加查询参数解决了该问题。&useSSL=false

enter image description here

jdbc:mysql://${jdbc_url}:${jdbc_port}/${database_name}?serverTimezone=UTC&autoReconnect=true&useSSL=false&failOverReadOnly=false&maxReconnects=10

0赞 mjaggard 9/21/2022 #50

这也可能是MySQL消亡的原因。就我而言,我有一个查询触发了MySQL中的错误,因此每当执行查询时,服务器都会死亡并重新启动。查看MySQL错误日志,看看是否发生了这种情况。 就我而言(MacOS 上的 Homebrew),那是在/usr/local/var/mysql/<machinename>.err

由于我在测试系统上看到了这一点,我最终删除并重新创建了我的数据库,这解决了这个问题,但我不敢想象如果它在生产中我会做什么。

0赞 BugsOverflow 7/30/2023 #51

我只想添加另一个答案,因为它并不总是您的后端配置或连接池等中的问题。

有时它也是数据库的基础设施,它所在的服务器的位置,因此请确保您拥有良好的数据库基础设施(CPU、RAM、网络等),并且它位于应用程序的同一区域,这样您将提高很多性能并停止收到此错误消息,在某些情况下,正如我试图解释的那样, 是关于您的数据库的更多信息