系统在sit测试过程中,经常突然无法访问,重启服务就又可以正常运行一段时间,然后突然又无法访问,系统出现假死状态,反复如此!
重启虽然是万能的,但不能根据解决问题,严重影响sit 测试进展,必须尽快找出原因并解决,况且有这种问题出现系统是无法上生产的。
1、系统有问题,程序员首当其冲就是日志分析,如下,最早显示 Session not established or timeout!(session超时)
分析e4a及cmis的session的处理代码,没发现什么问题。
--------日志-----------
10:11:43.047 [http-8080-6] ERROR c.m.f.f.s.filter.MideaSSOLoginFilter - sso client sessionid 53F0A1AD92CA1126F1D22C0291F6CED3
[2016-10-21 10:11:43,049 INFO] Accept request: /cmis.ecf/queryPAuthList.do
[2016-10-21 10:11:43,049 DEBUG] Get user's locale settings via session...
[2016-10-21 10:11:43,049 DEBUG] Process request: /cmis.ecf/queryPAuthList.do throws Exception:
com.ecc.emp.session.SessionException: Session not established or timeout!
--------日志----------
2、继续分析日志,找到最初报错的地方(日志如下):Name WFDataSource is not bound in this Context,
报错的意思是系统上下文中没找到数据源,即是请求在连接数据源时出错了。
2016-10-21 15:50:50,134 INFO Transaction - Apply new connection from data source...
2016-10-21 15:50:50,135 ERROR DataSource - Failed to initialize data Source jndiName=java:comp/env/WFDataSource
javax.naming.NameNotFoundException: Name WFDataSource is not bound in this Context
at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
3、根据上2,找度娘综合分析出是由于tomcat配置的数据库连接池的连接已经被占用了,但没有被释放,导致后面的请求无法再连接数据库
,因而报错,导致系统也会出现假死状态,无法登入。
4、查看tomcat数据源连接配置,发现参数maxActive(最大连接数)配置为20,且removeAbandoned(启动连接回收)默认为false,即不开启。
也就是说超过20个连接时就会出问题,请求就无法连接上数据源。可以查看数据库监控看连接数。
5、据4分析 只能增加连接数了,刚开始只修改了maxActive为50,没有开启removeAbandoned,连接还是不够用,问题还是会反复出现。
6、最后修改maxActive为200,且removeAbandoned=“true”, removeAbandonedTimeout="180" (超时180s自动回收池连接),困扰一个星期的问题得以解决!
在使用tomcat数据库连接池时,应当加入以下标红的两个参数定时去回收释放时间超时的连接资源。
如果开启" removeAbandoned ",那么连接在被认为超时时可能被池回收. 这个机制在(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)时被触发.
举例:当maxActive=20, 活动连接为18,空闲连接为1时可以触发" removeAbandoned ".但是活动连接只有在没有被使用的时间超过"removeAbandonedTimeout"时才被删除,默认300秒.在resultset中游历不被计算为被使用.
logAbandoned=true的话,将会在回收事件后,在log中打印出回收Connection的错误信息,包括在哪个地方用了Connection却忘记关闭了,在调试的时候很有用。