最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot整合Atomikos的示例詳解

 更新時(shí)間:2024年11月04日 08:23:15   作者:我是小趴菜  
這篇文章主要為大家詳細(xì)介紹了幾種分布式事務(wù)的解決方案的兩階段提交Atomikos,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

什么是Atomikos

Atomikos是一個(gè)開源的事務(wù)管理器,用于管理和控制分布式事務(wù)的執(zhí)行流程,提供了可靠的,高性能的事務(wù)管理解決方案,可以與多種應(yīng)用和數(shù)據(jù)庫集成

實(shí)戰(zhàn)

創(chuàng)建springBoot項(xiàng)目,pom.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.14</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.xpc</groupId>
    <artifactId>distribute-transaction</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jta-atomikos</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>2.3.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

配置多數(shù)據(jù)源

server.port=8080

#數(shù)據(jù)源test
spring.test-datasource.driverClassName = com.mysql.jdbc.Driver
spring.test-datasource.jdbc-url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.test-datasource.username = root
spring.test-datasource.password = 12345

#數(shù)據(jù)源cyp
spring.cyp-datasource.driverClassName = com.mysql.jdbc.Driver
spring.cyp-datasource.jdbc-url = jdbc:mysql://localhost:3306/test_1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.cyp-datasource.username = root
spring.cyp-datasource.password = 12345

logging.level.com.atomikos = debug

多數(shù)據(jù)源配置類

//配置掃描對(duì)應(yīng)的dao層的包
@MapperScan(basePackages = "com.xpc.dao", sqlSessionFactoryRef = "testSqlSessionFactory")
@Configuration
public class TestMyBatisConfig {


    @SneakyThrows
    @Bean
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource") DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }
}
package com.xpc.config;

import lombok.SneakyThrows;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.xpc.dao1",sqlSessionFactoryRef = "cypSqlSessionFactory")
public class CypMyBatisConfig {

    @SneakyThrows
    @Bean
    public SqlSessionFactory cypSqlSessionFactory(@Qualifier("cypDataSource") DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }
}

Atomikos配置

import com.atomikos.jdbc.AtomikosDataSourceBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class AtomikosDataSourceConfig {


    @Value("${spring.test-datasource.jdbc-url}")
    private String testUrl;

    @Value("${spring.test-datasource.username}")
    private String testUser;

    @Value("${spring.test-datasource.password}")
    private String testPassword;

    @Value("${spring.cyp-datasource.jdbc-url}")
    private String cypUrl;

    @Value("${spring.cyp-datasource.username}")
    private String cypUser;

    @Value("${spring.cyp-datasource.password}")
    private String cypPassword;
    @Bean(name = "testDataSource")
    public DataSource testDataSource() {
        AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
        //設(shè)置唯一資源name
        atomikosDataSourceBean.setUniqueResourceName("testDataSource");
        atomikosDataSourceBean.setXaDataSourceClassName("com.mysql.cj.jdbc.MysqlXADataSource");
        Properties properties = new Properties();
        properties.setProperty("URL", testUrl);
        properties.setProperty("user", testUser);
        properties.setProperty("password", testPassword);
        atomikosDataSourceBean.setXaProperties(properties);
        return atomikosDataSourceBean;
    }


    @Bean(name = "cypDataSource")
    public DataSource cypDataSource() {
        AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
        //設(shè)置唯一資源name
        atomikosDataSourceBean.setUniqueResourceName("cypDataSource");
        atomikosDataSourceBean.setXaDataSourceClassName("com.mysql.cj.jdbc.MysqlXADataSource");
        Properties properties = new Properties();
        properties.setProperty("URL", cypUrl);
        properties.setProperty("user", cypUser);
        properties.setProperty("password", cypPassword);
        atomikosDataSourceBean.setXaProperties(properties);
        return atomikosDataSourceBean;
    }
}
import org.springframework.context.annotation.Configuration;
import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.DependsOn;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.jta.JtaTransactionManager;

import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;

@Configuration
public class AtomikosConfig {


    @Bean(name = "userTransaction")
    public UserTransaction userTransaction() {
        return new UserTransactionImp();
    }

    @Bean(name = "atomikosTransactionManager")
    public TransactionManager atomikosTransactionManager() {
        return new UserTransactionManager();
    }

    @Bean(name = "platformTransactionManager")
    @DependsOn({"userTransaction", "atomikosTransactionManager"})
    public PlatformTransactionManager transactionManager() {
        UserTransaction userTransaction = userTransaction();
        TransactionManager transactionManager = atomikosTransactionManager();
        return new JtaTransactionManager(userTransaction, transactionManager);
    }
}

dao層

@Mapper
public interface TestDao {

    @Insert("insert into t_xpc (name) values (#{name})")
    void insert(Test1 test1);
}
@Mapper
public interface CypDao {

    @Insert("insert into t_cyp (name) values (#{name})")
    void insert(Tcyp tcyp);
}

接下來就是service業(yè)務(wù)了

@Service
public class XpcService {


    @Resource
    private TestDao testDao;

    @Resource
    private CypDao cypDao;


    @Transactional(rollbackFor = Exception.class)
    public String test() {
        Test1 test1 = new Test1();
        test1.setName("xpc-5");
        testDao.insert(test1);

        Tcyp tcyp = new Tcyp();
        tcyp.setName("xpc-5");
        cypDao.insert(tcyp);

        int i = 1/0;
        return "success";
    }
}

到這里springboot整合Atomikos就完成了,然后我們可以調(diào)用下該test方法,因?yàn)?int i = 1/0; 會(huì)拋出異常,所以這兩條數(shù)據(jù)都不會(huì)插入成功,也就意味著事務(wù)成功回滾了

Atomikos有什么缺點(diǎn)嗎?

Atomiko提供了兩階段提交,那么兩階段提交會(huì)有什么問題?

1:?jiǎn)吸c(diǎn)問題

事務(wù)管理器是直接集成在我們服務(wù)中的,也就是java進(jìn)程中的,如果這時(shí)候這個(gè)服務(wù)掛了,那么整個(gè)分布式事務(wù)就都不可用了

2:資源鎖定問題

在事務(wù)第一階段的時(shí)候,我們的資源管理器RM就會(huì)鎖定一些資源,這時(shí)候,其它事務(wù)進(jìn)來就無法再次鎖定同樣的資源了,也就造成了阻塞的問題

如果這時(shí)候碰到了單點(diǎn)問題,導(dǎo)致這些資源釋放不掉,那么其它事務(wù)就再也拿不到這些資源了

3:性能瓶頸問題

事務(wù)管理器在發(fā)起第一階段的時(shí)候,必須等到所有的資源管理器都返回OK了,才會(huì)發(fā)起第二階段commit,如果這時(shí)候有一個(gè)資源管理在第一階段遲遲沒有返回OK,那么事務(wù)管理器就會(huì)一直阻塞在這里

4:數(shù)據(jù)不一致

假設(shè)現(xiàn)在事務(wù)管理器(TM)收到所有資源管理器(RM)的第一階段OK響應(yīng)了,這時(shí)候就會(huì)發(fā)起第二階段的commit了,但是這時(shí)候由于某些原因,導(dǎo)致某個(gè)資源管理器(RM)沒有收到commit,這時(shí)候其它的資源管理器(RM)已經(jīng)提交了,但是這個(gè)資源管理器(RM)還是沒有提交事務(wù)的,這時(shí)候就造成了數(shù)據(jù)不一致的問題了

以上就是springboot整合Atomikos的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于springboot整合Atomikos的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • log4j使用詳細(xì)解析

    log4j使用詳細(xì)解析

    Log4j 除了可以記錄程序運(yùn)行日志信息外還有一重要的功能就是用來顯示調(diào)試信息。下面通過本文給大家介紹log4j使用詳細(xì)解析,感興趣的朋友一起看看吧
    2017-10-10
  • Java后臺(tái)基于POST獲取JSON格式數(shù)據(jù)

    Java后臺(tái)基于POST獲取JSON格式數(shù)據(jù)

    這篇文章主要介紹了Java后臺(tái)基于POST獲取JSON格式數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring Boot 日志級(jí)別、持久化與 SLF4J 配置詳細(xì)攻略

    Spring Boot 日志級(jí)別、持久化與 SLF4J 配置詳細(xì)攻略

    本文簡(jiǎn)要介紹了Spring Boot項(xiàng)目中的日志系統(tǒng),包括日志的定義、作用、使用方法、級(jí)別分類、配置以及日志持久化的重要性,通過示例和代碼,解釋了如何使用日志進(jìn)行問題排查、行為審計(jì)、狀態(tài)監(jiān)控,并展示了如何配置日志級(jí)別和持久化路徑,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • java發(fā)送郵件及打開狀態(tài)判斷分析實(shí)例

    java發(fā)送郵件及打開狀態(tài)判斷分析實(shí)例

    這篇文章主要為大家介紹了java發(fā)送郵件及打開狀態(tài)判斷分析實(shí)例
    2023-12-12
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單鏈表與雙向鏈表

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)單鏈表、雙向鏈表的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot通過yml和xml文件配置日志輸出方法

    SpringBoot通過yml和xml文件配置日志輸出方法

    這篇文章主要介紹了SpringBoot通過yml和xml文件配置日志輸出方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • 解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的問題

    解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的問題

    這篇文章主要介紹了解決IDEA誤刪out目錄下的文件導(dǎo)致404無法訪問的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot優(yōu)雅實(shí)現(xiàn)接口的多實(shí)現(xiàn)類方式詳解

    SpringBoot優(yōu)雅實(shí)現(xiàn)接口的多實(shí)現(xiàn)類方式詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot優(yōu)雅實(shí)現(xiàn)接口的多實(shí)現(xiàn)類方式的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-10-10
  • Java開發(fā)中StepBuilder模式詳解

    Java開發(fā)中StepBuilder模式詳解

    Step builder多階段步驟構(gòu)造器模式是一種對(duì)象創(chuàng)建軟件設(shè)計(jì)模式,與傳統(tǒng)構(gòu)建器模式進(jìn)行比較時(shí),步驟構(gòu)建器模式提供了一些簡(jiǎn)潔的好處,這篇文章主要介紹了Java開發(fā)中StepBuilder模式的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • 一文搞懂Java克隆及深拷貝與淺拷貝的區(qū)別

    一文搞懂Java克隆及深拷貝與淺拷貝的區(qū)別

    在編程中,通常通過實(shí)現(xiàn)Cloneable接口和重寫clone方法來實(shí)現(xiàn)對(duì)象的克隆,然而,需要注意的是克隆操作可能存在深拷貝和淺拷貝的區(qū)別,在使用時(shí)需要根據(jù)實(shí)際需求選擇合適的克隆方式,本文就給大家詳細(xì)講講什么是克隆以及深拷貝與淺拷貝的區(qū)別,需要的朋友可以參考下
    2023-08-08

最新評(píng)論

乌拉特后旗| 丹凤县| 砚山县| 大宁县| 弋阳县| 芦山县| 尼勒克县| 咸丰县| 岗巴县| 海原县| 富宁县| 梨树县| 洛浦县| 肇东市| 平利县| 金湖县| 和田县| 鄂温| 盈江县| 象州县| 玛曲县| 新河县| 登封市| 隆回县| 色达县| 武清区| 双流县| 聊城市| 长泰县| 安龙县| 旅游| 西乌| 伊吾县| 方山县| 白山市| 神池县| 龙南县| 安图县| 麻城市| 潍坊市| 同心县|