问题描述
在手写 获取数据库连接 时,发生如下的报错:
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);
}