atomikosdatasourcebean mysql_SpringBoot2整合JTA組件實現多數據源事務管理

一、JTA組件簡介

1、JTA基本概念

JTA即Java-Transaction-API,JTA允許應用程序執行分布式事務處理,即在兩個或多個網絡計算機資源上訪問并且更新數據。JDBC驅動程序對JTA的支持極大地增強了數據訪問能力。

XA協議是數據庫層面的一套分布式事務管理的規范,JTA是XA協議在Java中的實現,多個數據庫或是消息廠商實現JTA接口,開發人員只需要調用SpringJTA接口即可實現JTA事務管理功能。

JTA事務比JDBC事務更強大。一個JTA事務可以有多個參與者,而一個JDBC事務則被限定在一個單一的數據庫連接。下列任一個Java平臺的組件都可以參與到一個JTA事務中

2、分布式事務

分布式事務(DistributedTransaction)包括事務管理器(TransactionManager)和一個或多個支持 XA 協議的資源管理器 ( Resource Manager )。

資源管理器是任意類型的持久化數據存儲容器,例如在開發中常用的關系型數據庫:MySQL,Oracle等,消息中間件RocketMQ、RabbitMQ等。

事務管理器提供事務聲明,事務資源管理,同步,事務上下文傳播等功能,并且負責著所有事務參與單元者的相互通訊的責任。JTA規范定義了事務管理器與其他事務參與者交互的接口,其他的事務參與者與事務管理器進行交互。

二、SpringBoot整合JTA

項目整體結構圖

e85c402f7b492c9330f62a0253f58f3a.png

1、核心依賴

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-jta-atomikos

2、環境配置

這里jtaManager的配置,在日志輸出中非常關鍵。

spring:

jta:

transaction-manager-id: jtaManager

# 數據源配置

datasource:

type: com.alibaba.druid.pool.DruidDataSource

data01:

driverClassName: com.mysql.jdbc.Driver

dbUrl: jdbc:mysql://localhost:3306/data-one

username: root

password: 000000

data02:

driverClassName: com.mysql.jdbc.Driver

dbUrl: jdbc:mysql://localhost:3306/data-two

username: root

password: 000000

3、核心容器

這里兩個數據庫連接的配置手法都是一樣的,可以在源碼中自行下載閱讀。基本思路都是把數據源交給JTA組件來統一管理,方便事務的通信。

數據源參數

@Component

@ConfigurationProperties(prefix = "spring.datasource.data01")

public class DruidOneParam {

private String dbUrl;

private String username;

private String password;

private String driverClassName;

}

JTA組件配置

package com.jta.source.conifg;

@Configuration

@MapperScan(basePackages = {"com.jta.source.mapper.one"},sqlSessionTemplateRef = "data01SqlSessionTemplate")

public class DruidOneConfig {

private static final Logger LOGGER = LoggerFactory.getLogger(DruidOneConfig.class) ;

@Resource

private DruidOneParam druidOneParam ;

@Primary

@Bean("dataSourceOne")

public DataSource dataSourceOne () {

// 設置數據庫連接

MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();

mysqlXADataSource.setUrl(druidOneParam.getDbUrl());

mysqlXADataSource.setUser(druidOneParam.getUsername());

mysqlXADataSource.setPassword(druidOneParam.getPassword());

mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);

// 事務管理器

AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();

atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);

atomikosDataSourceBean.setUniqueResourceName("dataSourceOne");

return atomikosDataSourceBean;

}

@Primary

@Bean(name = "sqlSessionFactoryOne")

public SqlSessionFactory sqlSessionFactoryOne(

@Qualifier("dataSourceOne") DataSource dataSourceOne) throws Exception{

// 配置Session工廠

SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

sessionFactory.setDataSource(dataSourceOne);

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

sessionFactory.setMapperLocations(resolver.getResources("classpath*:/dataOneMapper/*.xml"));

return sessionFactory.getObject();

}

@Primary

@Bean(name = "data01SqlSessionTemplate")

public SqlSessionTemplate sqlSessionTemplate(

@Qualifier("sqlSessionFactoryOne") SqlSessionFactory sqlSessionFactory) {

// 配置Session模板

return new SqlSessionTemplate(sqlSessionFactory);

}

}

4、測試對比

這里通過兩個方法測試結果做對比,在兩個數據源之間進行數據操作時,只需要在接口方法加上@Transactional注解即可,這樣保證數據在兩個數據源間也可以保證一致性。

@Service

public class TransferServiceImpl implements TransferService {

@Resource

private UserAccount01Mapper userAccount01Mapper ;

@Resource

private UserAccount02Mapper userAccount02Mapper ;

@Override

public void transfer01() {

userAccount01Mapper.transfer("jack",100);

System.out.println("i="+1/0);

userAccount02Mapper.transfer("tom",100);

}

@Transactional

@Override

public void transfer02() {

userAccount01Mapper.transfer("jack",200);

System.out.println("i="+1/0);

userAccount02Mapper.transfer("tom",200);

}

}

三、JTA組件小結

在上面JTA實現多數據源的事務管理,使用方式還是相對簡單,通過兩階段的提交,可以同時管理多個數據源的事務。但是暴露出的問題也非常明顯,就是比較嚴重的性能問題,由于同時操作多個數據源,如果其中一個數據源獲取數據的時間過長,會導致整個請求都非常的長,事務時間太長,鎖數據的時間就會太長,自然就會導致低性能和低吞吐量。

因此在實際開發過程中,對性能要求比較高的系統很少使用JTA組件做事務管理。作為一個輕量級的分布式事務解決方案,在小的系統中還是值得推薦嘗試的。

最后作為Java下的API,原理和用法還是值得學習一下,開闊眼界和思路。

四、源代碼地址

到此這篇關于SpringBoot2整合JTA組件實現多數據源事務管理的文章就介紹到這了,更多相關SpringBoot2 JTA多數據源事務管理內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533900.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

crt 8.7.3 黑暗模式_民謠纏繞厄運金屬,抒情中的黑暗故事

2020/7/31,瑞典厄運/重金屬樂隊Dun Ringill,發表了新專輯“Library of Death”。“Library Of Death”是瑞典樂隊Dun Ringill的第二張唱片,由The Order of Israfel、Doomdogs等成員發起。樂隊的聲音,介于重金屬和厄運金屬之間&…

前窗玻璃膜貼了一周還有氣泡_關于車窗玻璃的養護你了解多少?

【中國皮卡網 維修保養】車窗玻璃的養護是最容易忽視的,但它也是非常重要的,雖然在用車過程中我們很少直接接觸車窗玻璃,但是它卻時時刻刻在影響著駕駛者。相信很多人會有洗車的習慣,洗好之后的車窗玻璃非常明亮,不僅僅…

c語言新龜兔賽跑_幽默 | 新龜兔賽跑

新龜兔賽跑作者 / 何必加自從輸給了烏龜后,兔子心里很是生氣。這一天,他又遇見了烏龜,要求和他比賽,一定要一雪前恥。烏龜答應了,并且約定連比三場。第一場還是兔子輸了,原來他一著急,跑錯了方向…

PHP無法執行MySQL語句,解決PHP執行批量MySQL語句的問題

這篇文章主要為大家詳細介紹了解決PHP執行批量MySQL語句的問題,具有一定的參考價值,可以用來參考一下。感興趣的小伙伴,下面一起跟隨512筆記的小玲來看看吧!當有多條mysql語句連起來需要執行,比如$sqls “insert table…

bugku 雜項 就五層你能解開嗎_長春老舊小區加裝電梯,你家符合條件嗎?_媒體_澎湃新聞...

新朋友戳藍字關注我們哦!長春市老舊小區開始加裝外置電梯大家都很關注很多市民也在想我家符合加裝條件嗎?能申請嗎?伴隨著長春市朝陽區3個老舊小區加裝電梯工作的結束,這項惠民工程也成為了老百姓茶余飯后的談資,那么大…

vba 指定列后插入列_Excle中的VBA介紹分享

SunYoung1、什么是VBAVisual Basic for Applications(VBA)是Visual Basic的一種 宏 語言,它能使常用的程序自動化,是針對Office開發的一種工具,通俗點講,VBA是一種Excle能聽懂識別的編程語言。2、在Excle中VBA的作用2.1、實現Exce…

php中文歌詞,html如何制作滾動歌詞

html制作滾動歌詞的方法:首先在標簽里面寫好編碼格式,引入css樣式和jQuery;然后放置播放器,代碼為【】。本教程操作環境:windows7系統、html5版,DELL G3電腦。html制作滾動歌詞的方法:首先我們創…

docker run 服務名_在 WSL2.0 的 Ubuntu 18 里使用 Docker

近日,隨著Windows 10 2004版本的發布,WSL 2經過了近一年的insider測試,現在也正式上線了。Windows 10 2004中引入了一個真實的Linux kernel,使得系統全部的系統調用更加兼容。這也是首次,Linux kernel安裝在Windows系統…

vb.net如何查詢電腦麥克風收到聲音_EMUI 10.1 跨屏協同實測:這一次把你的手機「搬」進電腦...

智能手機發展到現在,我們越來越需要手機與其他設備進行互聯互通。電腦是我們辦公最常用的工具,手機則是生活必需設備,這兩者的協同需求,自然也就成為了大多數用戶的痛點。Apple 用隔空投送、接力、隨航等連續互通功能來打造系統生…

浮動導航欄php源碼,JQuery 浮動導航欄實現代碼

JQuery 浮動導航欄/* 浮動導航欄 Begin */#floatMenu{padding-top: 5px;background: url(http://img.jb51.net/images/quickmenu.gif) no-repeat;border: 1px solid #dcdcdc;position: absolute;top: 250px;left: 5px;margin-left: 0px;width: 86px;}#floatMenu ul{margin-left…

gerber文件怎么導貼片坐標_SMT貼片工序

貼片,也稱SMT,就是把元器件用貼片機設備貼裝在印刷好的PCB板上。貼片這一過程之所以用“貼”字,是因為錫膏內有助焊劑的成分,有一定的粘性,能夠在沒有熔化的時候,也能夠黏住元器件。SMT又稱貼片&#xff0c…

es內嵌文檔查詢_ElasticSearch 文檔的增刪改查都不會?

本文主要是介紹 ElasticSearch 的文檔增刪改查和批量操作,同時會介紹一些 REST API 返回狀態碼的具體含義。我們先來看下這個表:這個表包含了 Index、Create、Read、Update、Delete 這五種方法,我們先來看下 CRUD 操作的 HTTP 請求都長什么樣…

如何在ps添加箭頭_「PS精選案例教程」制作斑駁生銹字體

這個教程會教您如何設計發光斑駁的字體特效,會教您運用PS濾鏡和紋理圖片,同時也詮釋了如何運用筆刷和圖層樣式給最終的字體效果增添光感。來,先看看最終效果!第一步:創建一個1024*768的新文檔。前景色#532118&#xff…

php 獲取系統環境變量,java讀取操作系統環境變量

java讀取操作系統環境變量import java.util.*;import java.io.*;class SysProb{//返回當前系統變量的函數,結果放在一個Properties里邊,這里只針對win2k以上的,其它系統可以自己改進public Properties getEnv() throws Exception{Properties …

查python答案的軟件-中國大學MOOC的APP慕課用Python玩轉數據答案查題公眾號

下面屬于歐盟成員對土耳其要求加入歐盟的顧慮的一項是:()A.土耳其地理位置特殊B.土耳其經濟發 某種雙面高密軟盤片格式化后,若每面有A個磁道,每個磁道有B個扇區,每個扇區有C個字節。則該種軟盤 通信工程施工中電源線與…

車輛調度 matlab,基于遺傳算法的車輛調度問題的matlab源程序

越界 發表于 2013-7-8 09:16 有償服務哦function chushis)K4; %最多4輛車inn100;%迭代次數上限citynum8;%需求點數量KMcitynumK1; %配送途徑種類%產生初始種群mzeros(1,inn);mm;szeros(inn,citynumK1);for i1:1:inns(i,:)randperm(KM); %隨機排列構成個體ends[m s];for i1:inn…

strtotime()加半個小時_椰子雞這樣做太好吃了,一滴水不用加,鮮香嫩滑,做法非常簡單...

轉眼就是6月了,時間真的好快啊,好似白駒過隙,一眼就過去了。剛剛還是桃花開的時候,轉眼五月桃都熟了。不得不說,李煜說得很對,“林花謝了春紅,太匆匆!”6月了,6月有什么呢…

webpack 入口文件 php,如何實現webpack多入口文件打包配置

本篇文章主要介紹了webpack多入口文件頁面打包配置詳解,現在分享給大家,也給大家做個參考。大多數情況下,我們使用 webpack來打包單頁應用程序,這個時候只需要配置一個入口,一個模板文件,但也不盡是如此&am…

接口里面的方法都是抽象方法嗎_大家都在講高中學習的方法有哪些,那方法和技巧有什么異同的嗎?...

大家都在講高中學習的方法有哪些,那方法和技巧有什么異同嗎?高中怎樣學習,方法重要還是技巧更重要?老牛倒是覺得,二者密不可分,缺一不可。那么,我們一起來看看,高中怎樣學習才是最好…

python 筆試題 英方_4000字轉型數據分析師筆試面試經驗分享

大家好,我是戴師兄~在上一篇文章中我分享了快速自學數據分析的經驗。本篇文章,我將跟大家分享下我的筆試和面試心得。開頭先說說我轉型前的職業背景:想看筆試面試經驗的同學萌可以直接跳過這一段~2018年我從中國人民大學經濟管理學專業畢業&a…