多数据源支持遇见的一个小问题

描述:

在项目中使用到多数据源,因此使用了ThreadLocal<String>记录了当前线程持有的sqlSession链接。并且自定义了注解DataSource,用于AOP,在service层做切面,在方法执行之前,更改数据源到另一个库,然后方法执行完后,删掉当前线程在ThreadLocal中的值,巩固一下,ThreadLocal内部是一个HashMap,key为Thread.currentThread()。

问题:

在方法A调用方法B的时候,如果A和B都用了注解,声明需要更改数据源,则在方法B执行完之后,到A执行完之前的代码,dao层总是空指针。

分析:

aop在每次方法执行前后,都修改数据源,方法前set(),方法后remove,但是当A调B的时候,如果B执行完后,将ThreadLocal.remove(),那么会将Map.entry(),都删除,导致后边拿不到数据源,因此出现空指针。

解法:将ThreadLocal<String>改为ThreadLocal<Stack<String>>,也就是维护一个栈,方法调用之前,入栈,设置数据源到a,方法执行完,将a删除,这样如果A调B,那么当进入B之前栈中值:a,进入B之前:ab,离开B之后:a,离开A之后:null,这样就不会出现问题了。

模型: