问题描述和报错和解决:
可能有不少人你跟我一样在本地测试正常,代码啥都没动,将项目部署到云服务器却出现问题。那极有可能就是环境不一样导致的。
下面是我遇到的一个报错(截图放到最后)。这个报错涉及到代码逻辑,对其他人可能没有什么参考价值。
但是通过报错去定位,发现sessionFactory为空指针。说明了:连接数据库失败!
数据库连接失败的原因有很多种:
1、MySQL服务器是否已经启动
2、项目的配置文件出现错误。比如说:账号,密码,驱动(不同版本的MySQL要用不同的驱动包)
账号和密码我就不说了。我来说说驱动jar包的问题。我在本地的MySQL是5.7,而云服务器上装的是MySQL8。那么需要在idea修改数据库配置文件和gradle依赖。我这里修改的是hibernate的配置文件,主要修改driver和url。修改后driver可能会爆红,因为本地可能还没有对应的驱动jar包。取到build.gradle修改mysql驱动包的依赖,将它修改为8以上。然后不要忘了,rebuild和重新打war包。打好后最好确认一下war里面的配置文件是否真的已经修改成功,防止war包还是以前的。
3、MySQL8.0 之前的版本中加密规则是mysql_native_password,而在MySQL8之后,加密规则是caching_sha2_password
可能会出现报错: Authentication plugin 'caching_sha2_password' cannot be loaded。也可能没有,但是数据库连接失败也有可能是这个原因!!!
用户密码的加密规则是可以查看和修改的,对应的信息放在了系统数据mysql种的user表中。
在云服务器上登录进入MySQL数据库,查看用户的加密规则:
use mysql;
select user, host, plugin from user;
默认root账户并不能使用与远程连接,所以我们要么打开权限,要么新增账户(自行百度)。我这里新增了一个ysq的账户用于远程连接,并且将该用户的密码加密规则修改为mysql_native_password;
ALTER USER '用户名'@'host' IDENTIFIED WITH mysql_native_password BY '该用户的密码';
假设我的ysq用户的密码为:123456,从表格种可以看出它的host的是“%”(任意主机)。那么我要修改它的加密规则,对应的sql语句为:ALTER USER 'ysq'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
修改后,记得刷新权限。
flush privileges;
然后去到云服务器上项目的目录,找到数据库的配置文件,将账户和密码,改为修改了加密规则的账户和其密码。然后记得重启Tomcat!!!