我的在的项目,分为很多小组,今天有个同事说生产上出现了一个问题,导致了非常严重的后果。
现象:
大概是这样的 :调用一个mybatis的很简单的mapper,正常查询回来会返回3条数据,但是他这个程序有点特殊的逻辑(其实也是结构没写好),有一点递归,递归中相当于又调用了这个mapper的这个方法,并且方法参数都一样,这时候查出的结果0条数据,出问题后影响非常大,相当于付错钱了这种严重危险。
不分析先解决问题:
不用分析,先解决,我直接让加上flushCache,因为这对mybatis的源码还比较熟悉,这块应该是缓存方面的问题,试了一下果然就好了。先让他赶紧上线。
分析:
接着来分析一下到底是什么原因让缓存出错了
mybatis的一级缓存的事呃我就不画图了(因为没那空闲)
原因是返回的List其实是原始的对象,可是写程序的人又操作了这个对象
看一下CACEH的源码吧
放Cache
cacheKey的构建
获取key
这样解了后只是解决了这个问题,单纯只解决这个问题就一句话,new ArrayList<>即可
,但是这是一个历史祖传代码,人工排查类似的问题太麻烦了,要找一个切入点改变mybatis的这种默认行为,有空再来继续写文章