java连接数据库失败:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

时间:2021-08-09 19:15:01

说一下我的情况:

  在测试环境中运行没有任何问题,但是导出war包之后,就将war包上传到线上服务器的webapps目录下,然后启动Tomcat,等待Tomcat将上传的war包解压(此时Tomcat没有启动成功,因为用户名和密码不正确),之后我手动修改了解压之后的数据库连接配置文件,然后再重启Tomcat,发现Tomcat启动失败,报错信息就是题目中的数据库用户名密码不正确。

  1、通过命令行的mysql -uroot -p输入密码可以登录(证明线上环境的账号和密码正确)

  2、使用最基本的JDBC,设置url、username、password,测试没有问题,但是项目就是报错。

 

 

尝试过

  1、清缓存(包括整个项目的缓存,重新打包发布),电脑和服务器重启了n遍

  2、连接mysql的url中增加编码格式:

jdbc_url=jdbc:mysql://127.0.0.1:3306/myDB?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull
jdbc_username=root
jdbc_password=123456

  3、检查jdbc_username和jdbc_password的值前后是否有空格(删除多余的空格)

  4、检查是否开启远程连接(已经开启)

 

  上面这几种方式,在我这里并没有产生效果。

 

 

自己尝试了一下

  重新修改了一下登录用户的权限,看是否有用:

grant all on myDB.* to 'root'@'%' identified by '123456'
# 用户名为root,密码为123456的用户,允许其从任意ip登录
# 并且授予该用户对myDB这个数据库下所有表的所有权限(增删改查)

  发现没有用。

 

 

揭晓答案

  如果你仔细看一下我文章开头的描述就应该知道问题出在哪里了,有两个关注点:

  1、我在打包之前,数据库配置依旧是测试环境的连接信息。

  2、上传到服务器后,居然等解压完成后再手动修改密码,然后再重启Tomcat。

  其实问题就出在这两步,而解决方案很简单,就是在打包之前修改数据库连接信息,保证导出的包是线上配置(而不是测试环境的配置)。

  因为一旦打包之后,在修改配置文件,是没有效果的。

  咱们配置文件中一般会包含线上和线下的配置环境,请在打包之前,将线下环境的配置注释掉,然后删除线上环境的配置:

#offline_jdbc_url=xxxx
#offline_jdbc_url=xxxx
#offline_jdbc_url=xxxx

online_jdbc_url=xxxx
online_jdbc_url=xxxx
online_jdbc_url=xxxx

  当然,如果你不是这个问题,那么你依旧可以尝试一下我上面写的那些方法,看能否解决问题。