起因
某天,正式环境的应用启动失败,无法访问。
打开 catalina 日志,看到如下可疑日志。
WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [dgyfyweb] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
看到的第一个错误,是说应用已经注册了 JDBC,但是当应用停止(启动失败)时无法注销,防止内存泄漏,JDBC 已强制注销。
第一见这个 warning ,所以以为是数据库配置的,检查了一遍,然后也百度了一下这个问题,没任何结果。
再仔细往下看,看到第二种 warning。
WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [dgyfyweb] appears to have started a thread named [weixCache.data] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
意思是有个线程已经启动了,但无法停止。看这个线程名是项目中的 ehcache 问题。
由于一个 tomcat 部署了三个 tomcat,所以怀疑是不是 ehcache 冲突了。但是后来修改了 ehcache 还是不行。
然后就无计可施了,下了个结论是应用冲突,通过分应用到不同 tomcat 看看。
经过
然而将这个启动有问题的应用放到独立的 tomcat,发现还是同样的报错。
无意间打开了 localhost 启动日志,看到了一个异常。
java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
查了一下这个异常就是数据库时间段不支持存储 ‘0000-00-00 00:00:00’,看了一下抛异常的代码行数,是一处加载数据库到 ehcache 中,确实涉及到了 ehcache。
排查了表中,确实在 Timestamp 的字段上存在 ‘0000-00-00 00:00:00’ 值,修改之后重启,发现应用启动成功,终于可以访问了。
结果
catalina.log 并不能完全解决问题。
以往 tomcat 启动不成功,都是通过查看 catalina 日志,结果大部分问题都能展示出来并且能够解决。
然而这次遇到的问题,但看 catalina 文件毫无收获,可能是我没发现。
要不是偶然打开了 localhost 日志,怕是这个问题要托好久了。
所以说,排查 tomcat 启动问题,不要漏了 localhost 日志。