栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring 多数据源 JTA 事务管理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring 多数据源 JTA 事务管理

 一、pom.xml里添加

		
			org.springframework.boot
			spring-boot-starter-jta-atomikos
			2.6.6
		

 二、添加TransactionManagerConfig.class

package org.jeecg.modules.wms.config;

import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;
import org.springframework.context.annotation.*;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.jta.JtaTransactionManager;

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

@Configuration
@ComponentScan
@EnableTransactionManagement
public class TransactionManagerConfig {
    @Bean(name = "userTransaction")
    public UserTransaction userTransaction() throws Throwable {
        UserTransactionImp userTransactionImp = new UserTransactionImp();
        return userTransactionImp;
    }

    @Bean(name = "atomikosTransactionManager")
    public TransactionManager atomikosTransactionManager() throws Throwable {
        UserTransactionManager userTransactionManager = new UserTransactionManager();
        userTransactionManager.setForceShutdown(false);
        return userTransactionManager;
    }

    @Bean(name = "jta-transaction-manager")
    @DependsOn({"userTransaction", "atomikosTransactionManager"})
    @Primary
    public PlatformTransactionManager transactionManager() throws Throwable {
        return new JtaTransactionManager(userTransaction(), atomikosTransactionManager());
    }
}

三、添加 DynamicDataSourceProviderImpl.class

package org.jeecg.modules.wms.config;

import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.mysql.cj.jdbc.MysqlXADataSource;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;


@Service
@Primary
public class DynamicDataSourceProviderImpl implements DynamicDataSourceProvider {
    
    private final DynamicDataSourceProperties properties;

    public DynamicDataSourceProviderImpl(DynamicDataSourceProperties properties) {
        this.properties = properties;
    }

    @Override
    public Map loadDataSources() {
        Map dataSourcePropertiesMap = properties.getDatasource();
        Map dataSourceMap = new HashMap<>(dataSourcePropertiesMap.size() * 2);
        for (Map.Entry item : dataSourcePropertiesMap.entrySet()) {
            String poolName = item.getKey();
            DataSourceProperty dataSourceProperty = item.getValue();
            dataSourceProperty.setPoolName(poolName);
            // 接受数据源配置 并创建AtomikosDataSourceBean
            dataSourceMap.put(poolName, createDataSource(dataSourceProperty));
        }
        return dataSourceMap;
    }

    
    private DataSource createDataSource(DataSourceProperty dataSourceProperty) {
        MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
        mysqlXaDataSource.setUrl(dataSourceProperty.getUrl());
        mysqlXaDataSource.setPassword(dataSourceProperty.getPassword());
        mysqlXaDataSource.setUser(dataSourceProperty.getUsername());
        AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
        xaDataSource.setXaDataSource(mysqlXaDataSource);
        xaDataSource.setMinPoolSize(5);
        xaDataSource.setBorrowConnectionTimeout(60);
        xaDataSource.setMaxPoolSize(20);
        xaDataSource.setXaDataSourceClassName(dataSourceProperty.getDriverClassName());
        xaDataSource.setTestQuery("SELECt 1 FROM DUAL");
        xaDataSource.setUniqueResourceName(dataSourceProperty.getPoolName());
        return xaDataSource;
    }
}

四、应用

在需要管理多数据源事务的方法上使用@Transactional注解时,搭配上transactionManager = "jta-transaction-manager",其中的jta-transaction-manager是PlatformTransactionManager 对象注入为Bean时的name值,相关代码在TransactionManagerConfig.class中

	// 多数据源事务处理
	@Override
	@Transactional(rollbackFor = Exception.class, transactionManager = "jta-transaction-manager")
	public Boolean xxxxx(Integer orderId, Integer orderStatus) {...}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/856885.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号