springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析
生活随笔
收集整理的這篇文章主要介紹了
springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
????原本想用springboot+mybatis做多數據源的切換方案,想通過借鑒網上現有的方案,結果搜索后大量都是使用AbstractRoutingDataSource多數據源方案,通過實踐后,發現如果聲明了事務,將會在事務內部切換數據源失敗。結果,就是debug,看源碼找原因。下面是springboot+mybatis的調用棧,如果有點功力的同學們一看就知道了。
存在transaction情況下@Transactional切面切入攔截 DataSourceTransactionManagerdoBegin從threadlocal holder中獲取connection獲取不到獲取連接AbstractRoutingDataSource#getConnection封裝holder,存入threadLocal中,key為AbstractRoutingDataSource 獲取到,不再AbstractRoutingDataSource#getConnection此時,已經獲取到connection,如果@Transactional注解還有切換數據源的切面,則使用切面中切換好的數據源,如果沒有其他注解,則獲得配置的defaultDataSource的數據源。======================= step2 =============================== 之后,調用mybatis的mappermybatisExecutorprepareStatementgetConnection()SpringManagedTransactiongetConnection() 查看threadLocal中,key為AbstractRoutingDataSource,取出connection的holder如果有用holder里面的connection如果沒有從AbstractRoutingDataSource獲取新的連接======================= step3 ==================================== @Transactional注解的方法中還在調用其他需要切換數據源的service或者方法仍然走step2,由于從threadLocal可以獲取到connection,所以不會從AbstractRoutingDataSource獲取新的連接,也就是切換數據源失敗????這里的AbstractRoutingDataSource#getConnection方法是切換數據源的關鍵。如果在事務過程中,我們mybatis每次都是獲取threadlocal中key為AbstractRoutingDataSource的connection,則不會再調用AbstractRoutingDataSource中的getConnection方法切換數據源。
? ? 如果想解決這個問題,自定義吧。。。
?
轉載于:https://my.oschina.net/thinwonton/blog/2962391
總結
以上是生活随笔為你收集整理的springboot源码分析 - AbstractRoutingDataSource多数据源方案的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在VSCode中编写Kotlin/Jav
- 下一篇: std::vector使用简介