多資料來源是否用到連線池?開啟事務多資料來源為何失效?

2021-10-19 06:29:28 字數 2273 閱讀 2488

在spring獲取連線處我們看到了這個是如何獲取連線的

上面④資料來源就是我們在多資料來源配置的資訊

從上面可以看出關聯關係:datasource -> connctionpool. 也就是說,連線池是放在資料來源中的

看這個問題前,先考慮乙個問題:我們需要在事務中切換資料來源,會生效嗎?

答案是不可以,因為在事務開啟後,會復用 datasource的connection。復用datasource 的connection 會導致無法切換資料來源

參考:transaction事務註解和dynamicdatasource動態資料來源切換問題解決

一般**呼叫鏈:

repository@annotation(aop)-->defaultsqlsession-->******executor-->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中同乙個連線回滾的。

資料來源 連線池

資料來源 datasource?連線池connection pool 資料來源與連線池沒有必然聯絡 發現ds與cp的概念有些不清楚 資料來源一般與jndi在一起使用,jndi遮蔽了db的細節資訊,使用jndi獲取資料連線可以不用關心db的具體資訊 使用jndi需要配置資料來源 reference 使...

資料來源(連線池)

最好的連線池是druid,可充當連線池 資料庫訪問監視器 獲取sql執行日誌 手動建立資料來源步驟 基於c3p0 combopooleddatasource datasource newcombopooleddatasource datasource.setdriverclass com.mysql...

資料來源與連線池

資料來源 datasource 即資料 呼叫datasource.getconnection 即可獲取乙個連線,而無需關心連到哪個資料庫,使用者名稱 密碼是什麼.這比drivermanager.getconnection url,user,password 要先進多了.我們就通過這個datasour...