最近将之前的项目部署到了服务器之后,发现在长时间不访问网站后,再次打开页面会出现白屏现象,除非重新刷新页面,否则无法正常加载数据,使用F12查看请求返回的JSON数据发现提示内部错误,由此可知问题在服务端。
服务器相关信息:
OS:CentOS7
MySql:5.7
Tomcat:8.5
登录服务器,依次检查Nginx、Tomcat、Redis、MySql服务的运行状况,使用如下命令:
ps -ef|grep {服务名称}
检查后一切正常,下一步我们需要从日志文件入手,进入Tomcat安装目录,我这里使用了Tomcat压缩包解压的方式,因此只需要进入logs目录下即可(根据自己安装的实际目录寻找就行):
cd /resources/apache-tomcat-8.5.54/logs/
查看catalina.out文件内容,注意:此文件内容即为在Windows下使用IDE开发工具时Tomcat实时输出的内容,可以帮助我们快速定位问题。
cat catalina.out
发现异常信息如下:
Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: The last packet successfully received from the server was 426,962,099 milliseconds ago. The last packet sent successfully to the server was 426,962,100 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.;
通过内容可知,由于太久没有使用C3P0的连接池,超过了最大的有效时间,因此连接池资源被释放,MySql无法获得有效的资源,因此也无法取得数据。
知道了问题,那么解决也很容易,异常信息中也提供了解决方案,也就是说我们可以在mysql连接中添加autoReconnect属性来避免这个问题。
or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
由于我的项目在服务器上,使用war包的方式来部署,因此需要修改相关信息就需要重新生成war包或者对当前war包内的配置修改,为了方便起见直接进入Tomcat的webapps目录对war包修改,(这里我的war包名称为o2o,使用时替换为你自己的项目名称)
cd /resources/apache-tomcat-8.5.54/webapps/o2o/WEB-INF/classes
修改jdbc.properties的内容
vim jdbc.properties
在文件最后添加autoReconnect=true,多个参数之间使用&连接。(若为本地IDE开发,直接修改对应jdbc配置文件内容即可。)
jdbc.url = jdbc:mysql://{yourIpAddress}:3306/o2o?useUnicode=true&autoReconnect=true
至此问题修复完成。