最後使用到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即可,兩個以上數據源的配置同理