问题描述
昨天上线新版本,遇到一个问题。几年前的一个导入文件,进行银行卡号和银行名是否匹配的校验功能,出现了bug。一直抛出connection closed。由于是老功能,因此大家一致认为代码层面应该是久经考验了的,一直以为是数据库那边有问题。排查了半个小时,也没有找出原因。
后来,一位老同事,说你这个是不是事务运行的时间过长,导致连接被回收掉了。基于这一思路,去看了一下代码,才发现这个事务里面是个跨库操作。伪代码逻辑如下:
boolean isRight = checkData(cardNo, bankNm) ;// 二号库
if(!isRight){
isRight = checkData(cardNo, bankNm); //一号库`在这里插入代码片`
}
因为这里是跨库,于是可以推测两个连接,一号库的连接由于长时间没有使用,而被回收了。在去查看了weblogic的日志和配置后发现果然如此。之前配置,一个连接只有60秒没有活动就会被回收掉。修改后,程序运行正常。
反思
- 这地方的代码的问题:这是在一个循环里面,每一条去查询数据库进行验证。
- 在一个事务里边包含了跨库操作。这些都带来了风险。
- 之前运行很长时间,都没有造成事故,只是因为运气好。因为想要达成这样的条件,首先得循环次数够多,其次得长时间不需要查询一号库。
- 以后在写代码时候,要考虑到资源的管理,尽可能地将跨库操作进行拆解。像这里这个场景,完全可用先将所有数据在二号库验证完成后,再去一号库进行验证。这样就不需要在一个事务里面了。