spring ssm项目 ,部署在tomcat上,最近发现项目过一段时间,访问的接口就没有任何响应。
先ping服务器,没问题。telnet应用端口,发现telnet不上,tomcat主页偶尔可以偶尔不可以。
把tomcat下的日志拷贝下来,观察了从上一次重启到服务宕掉的日志,发现日志中并没有异常,比如说内存溢出,程序异常报错等等
初步认为是因为服务是通过手动开启的,而我以远程登录服务器的方式,导致进程坑能被系统关掉或者停掉.
那我通过类似console口连接的方式连接到服务器上,把服务注册为守护进程,这样子应该可以解决掉了,当时觉得问题解决掉了。
很快的,过了一段时间,出现了同样得问题了,因为当时应用程序并没有任何异常日志,所以暂时没有了思路。
尝试着在这段时间访问tomcat主页,tomcat正常访问。
连接到服务器,查看服务端口的情况,服务端口大部分情况都是close_wait,这让我觉得不太对劲。访问taomcat主页登录到管理界面,应用显示正常运行状态。
打开项目代码,用本机测试本地项目接口的运行情况,测试了一会儿,访问一个最近因为业务改变而做了修改的接口发现,这个接口多次被访问后,所有接口都没有任何响应了。当时没有注意到是这一个接口,开始怀疑数据库连接池配置出现问题,认真查看了数据库连接池配置,配置了连接最大最小连接数,空闲连接数,数据库连接最大空闲等待时间等等,查来查去,还是没发现配置的问题。而在测试的途中发现某个接口好像导致hang住的概率最大,开始查看接口代码。这段代码最近改写了,因为业务改变,当时用了原生获取sqlsessionfactory的connect过来直接使用,代码结束并没有关闭掉。因为是手动获取了连接,所以这个连接并没有被容器管理到,添加释放资源代码,再次打包,终于解决了问题。
这一次真的是自己给自己埋下了一个坑,也是因为容器做了很多管理操作,导致写代码的时候并没有严谨的对待资源释放的问题