多數據源是否用到連接池?開啟事務多數據源為何失效?


多數據源是否用到連接池?

在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中同一個連接回滾的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM