多數據源是否用到連接池?
在spring獲取連接處我們看到了這個是如何獲取連接的

上面④數據源就是我們在多數據源配置的信息

從上面可以看出關聯關系:dataSource -> connctionpool. 也就是說,連接池是放在數據源中的。
多數據源事務為何失效?
看這個問題前,先考慮一個問題:我們需要在事務中切換數據源,會生效嗎?
答案是不可以,因為在事務開啟后,會復用 dataSource的Connection。復用dataSource 的Connection 會導致無法切換數據源;
spring中數據源調用方式如下:
參考:Transaction事務注解和DynamicDataSource動態數據源切換問題解決
一般代碼調用鏈:
Repository@Annotation(AOP)-->DefaultSqlSession-->SimpleExecutor-->BaseExecutor.getConnection()-->SpringManagedTransaction.getConnection()--->連接為空-->AbstractRoutingDataSource.getConnection()-->拿到beforeAOP中注入的datasource的key, 所以每次都會動態切換數據源
事務代碼調用鏈:
service注解上@transactional-->TransactionInterceptor.interpter()-->TransactionAspectSupport.createTransactionIfNecessary()-->AbstractPlatformTransactionManager.getTransaction()-->DataSourceTransactionManager.doBegin()-->AbstractRoutingDataSource.determineTargetDataSource()[lookupKey==null去拿默認的Datasource, 不為空則使用獲取到的連接]-->DataSourceTransactionManager.setTransactional()[將連接設置到TransactionUtils的threadLocal中]--->Repository@Annotation-->執行一般調用鏈, 問題在於SpringManagedTransaction.getConnection()-->openConnection()-->DataSourceUtils.getConnection()-->TransactionSynchronizationManager.getResource(dataSource)不為空[從TransactionUtils的threadLocal中獲取數據源], 所以不會再去調用DynamicDataSource去獲取數據源




這個是我們設置的threadlocal中獲取的datasource名稱,然后根據名稱獲取(開始配置時,以key,value放入map中存儲了)

總結一下:事務開啟后,datasource 的連接會復用,但是如果不開啟事務,會一直走fetchConnection更新連接,每次都去獲取我們配置的(一般設置在threadLocal變量中)。
接着我們解釋一下為什么多數據源事務失效。

多數據源對應的是不同的datasource連接,回滾是在spring aop方法執行后捕獲異常,然后獲取threadLocal中同一個連接回滾的。
