JDBC 获取数据库连接时报异常 MySQLNonTransientConnectionException

问题描述

在手写 获取数据库连接 时,发生如下的报错:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client

代码如下:

public class ConnectionTest {
    @Test
    public void testConnection1() throws SQLException {
        // 1.提供java.sql.Driver接口实现类的对象
        Driver driver = new com.mysql.jdbc.Driver();

        // 2.提供 url,指明具体操作的数据
        String url = "jdbc:mysql://localhost:3307/test";

        // 3.提供 Properties的对象,指明用户名和密码
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "123456");

        // //4.调用driver的connect(),获取连接
        Connection connect = driver.connect(url, info);
        System.out.println(connect);
    }

原因分析:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:客户端不支持服务器请求的认证协议;考虑升级 MySQL 客户端

通过查看报错信息可以初步判断是由于MySQL版本不匹配导致的,经过排查后发现,在原来的代码中使用的是MySQL5版本的驱动,所以在获取Driver实现类的对象时,全类名为:com.mysql.jdbc.Driver
在这里插入图片描述

而在本地安装了MySQL5和MySQL8,端口3307又是设置在MySQL8上使用的,而在MySQL8 版本的驱动中,获取Driver实现类的对象时,全类名为:com.mysql.cj.jdbc.Driver
在这里插入图片描述

所以会出现版本不匹配的问题。


解决方案:

在知道了问题原因的情况下,我们只需要将使用的MySQL数据库版本与驱动版本相对应就可以解决问题了!

修改后的代码如下:

public class ConnectionTest {
    @Test
    public void testConnection1() throws SQLException {
        // 1.提供java.sql.Driver接口实现类的对象
        Driver driver = new com.mysql.jdbc.Driver();   // 对应 MySQL5 版本的驱动
//        Driver driver = new com.mysql.cj.jdbc.Driver();   // 对应 MySQL8 版本的驱动

        // 2.提供 url,指明具体操作的数据
        String url = "jdbc:mysql://localhost:3306/test";   // 对应 MySQL5 版本的数据库
//        String url = "jdbc:mysql://localhost:3307/test";   // 对应 MySQL8 版本的数据库

        // 3.提供 Properties的对象,指明用户名和密码
        Properties info = new Properties();
        info.setProperty("user", "root");
        info.setProperty("password", "123456");

        // //4.调用driver的connect(),获取连接
        Connection connect = driver.connect(url, info);
        System.out.println(connect);
    }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PandaMan~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值