给客户开发了一个应用系统,基于tomcat,用java开发的,采用前后端分离技术。系统使用一段时间之后,用户报错说,导入excel数据的时候,报错,导致后续操作都无法进行,需要重新启动系统才能够恢复正常。
经过开发人员在测试环境分析,重新导入这个excel文件,系统是正常的,没有出现异常。
我们猜想可能的问题:1)java导入程序出错,导致系统异常;2)数据库sql预计执行太慢,导致死锁。
于是上慢sql来查看数据库,没有发现执行缓慢的sql语句。
重新测试导入程序,没有发现错误。
是否是一个累积错误?
于是,模拟大量的操作,一段时间后,再导入excel文件,报错,提示是mysql数据库的连接数满了。
跟着这个问题去排查程序,没有发现程序异常错误。
猜想是,某个非常特定的分支,忘记了归还给数据库连接池那个连接。当多次偶然进入这个使用场景,每次都会占用一个连接,等到所有的连接都被占用,就会报这个错误。
如何解决?
第一, 排查程序,看是否存在没有“归还”给连接池,连接的问题。
第二, 设置数据库连接池的参数,当一个请求响应时间过长,就强制回收这个连接。
通过上述两个方法,解决了这个问题。
推荐阅读: