多數據源支持遇見的一個小問題

描述:

在項目中使用到多數據源,因此使用了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,這樣就不會出現問題了。

模型:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章