Spring+Ibatis多數據源問題

最後使用到Spring+Ibatis多數據源,但使用過程中發生了用戶訪問錯亂的現象,具體表現爲:使用數據源B的用戶去訪問數據源A的表,導致拒絕訪問。

這個問題,經過多次嘗試及網上搜索,發現問題所在:當一個事務發現SqlSession已存在的時候,則不會去創建新的SqlSession,所以導致使用數據源B的用戶去訪問數據源A的表,知道原因後,但具體怎麼解決還是沒有什麼頭緒,想着在Spring AOP中切換數據源,發現問題依然存在,說明默認情況下Spring AOP的方法調用與原方法在同一事務中,經過測試確實如此,順着這個思路,猜想:可不可以改變這種順序,我們知道事務在Spring中也是通過攔截器實現的,所以問題就定位在攔截器的調用順序上,我們的目標是先調用AOP方法,再調用事務攔截器,在Spring AOP的配置中配置order屬性

<aop:aspect id="myAop" ref="check" order="1">
       <aop:pointcut id="target" expression="execution(* com.spring.aop.Common.execute(..))"/>
      <aop:before method="checkValidity" pointcut-ref="target"/>
       <aop:after method="addLog" pointcut-ref="target"/>
     </aop:aspect>

同樣事務也可以配置order

<aop:advisor advice-ref="txAdvice"
             pointcut-ref="interceptorPointCuts" order="2"/>   

我們只需要配置AOP切面的order小於事務配置的order即可,兩個以上數據源的配置同理



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