披荆斩棘之springboot整合atomikos

披荆斩棘之springboot整合atomikos

1.导入jar包

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

2.数据源配置

server:
  port: 8090
spring:
  datasource:
    first:
       jdbcUrl: jdbc:mysql://localhost:3306/test
       username: root
       password: root
       min-pool-size: 3
       max-pool-size: 25
       max-lifetime: 20000
       borrow-connection-timeout: 30
       login-timeout: 30
       maintenance-interval: 60
       max-idle-time: 60
    second:
      jdbcUrl: jdbc:mysql://localhost:3306/test1
      username: root
      password: root
      min-pool-size: 3
      max-pool-size: 25
      max-lifetime: 20000
      borrow-connection-timeout: 30
      login-timeout: 30
      maintenance-interval: 60
      max-idle-time: 60

3.配置对应实体类

数据源1:

package com.kevin.datasource;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Data
@ConfigurationProperties(prefix = "spring.datasource.first")
public class DataSourceI {

    private String jdbcUrl;
    private String username;
    private String password;
    private int minPoolSize;
    private int maxPoolSize;
    private int maxLifetime;
    private int borrowConnectionTimeout;
    private int loginTimeout;
    private int maintenanceInterval;
    private int maxIdleTime;
    private String testQuery;

}

 数据源2:

package com.kevin.datasource;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@ConfigurationProperties(prefix = "spring.datasource.second")
public class DataSourceII {

    private String jdbcUrl;
    private String username;
    private String password;
    private int minPoolSize;
    private int maxPoolSize;
    private int maxLifetime;
    private int borrowConnectionTimeout;
    private int loginTimeout;
    private int maintenanceInterval;
    private int maxIdleTime;
    private String testQuery;

}

4.配置数据源+atomikos

package com.kevin.config;

import com.kevin.datasource.DataSourceI;
import com.mysql.cj.jdbc.MysqlXADataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.boot.jta.atomikos.AtomikosXADataSourceWrapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
@MapperScan(basePackages = "com.kevin.mapper.first",sqlSessionFactoryRef = "sqlSessionFactory1",sqlSessionTemplateRef = "sqlSessionTemplate1")
public class DataSourceConfigFirst {

    @Bean("dataSource1")
    public DataSource dataSource1(DataSourceI dataSource) throws Exception {
        MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
        mysqlXADataSource.setUrl(dataSource.getJdbcUrl());
        mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);
        mysqlXADataSource.setUser(dataSource.getUsername());
        mysqlXADataSource.setPassword(dataSource.getPassword());

        AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
        atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);
        atomikosDataSourceBean.setUniqueResourceName("dataSource1");
        atomikosDataSourceBean.setMinPoolSize(dataSource.getMinPoolSize());
        atomikosDataSourceBean.setMaxPoolSize(dataSource.getMaxPoolSize());
        atomikosDataSourceBean.setMaxLifetime(dataSource.getMaxLifetime());
        atomikosDataSourceBean.setBorrowConnectionTimeout(dataSource.getBorrowConnectionTimeout());
        atomikosDataSourceBean.setLoginTimeout(dataSource.getLoginTimeout());
        atomikosDataSourceBean.setMaintenanceInterval(dataSource.getMaintenanceInterval());
        atomikosDataSourceBean.setMaxIdleTime(dataSource.getMaxIdleTime());
        atomikosDataSourceBean.setTestQuery(dataSource.getTestQuery());

        return atomikosDataSourceBean;
    }

    @Bean("sqlSessionFactory1")
    public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }

    @Bean("sqlSessionTemplate1")
    public SqlSessionTemplate sqlSessionTemplate1(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory){
       SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
       return sqlSessionTemplate;
    }
}
package com.kevin.config;

import com.kevin.datasource.DataSourceII;
import com.mysql.cj.jdbc.MysqlXADataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.kevin.mapper.second",sqlSessionFactoryRef = "sqlSessionFactory2",sqlSessionTemplateRef = "sqlSessionTemplate2")
public class DataSourceConfigSecond {

    @Bean("dataSource2")
    public DataSource dataSource2( DataSourceII dataSource) throws Exception {
        MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
        mysqlXADataSource.setUrl(dataSource.getJdbcUrl());
        mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);
        mysqlXADataSource.setUser(dataSource.getUsername());
        mysqlXADataSource.setPassword(dataSource.getPassword());

        AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
        atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);
        atomikosDataSourceBean.setUniqueResourceName("dataSource2");
        atomikosDataSourceBean.setMinPoolSize(dataSource.getMinPoolSize());
        atomikosDataSourceBean.setMaxPoolSize(dataSource.getMaxPoolSize());
        atomikosDataSourceBean.setMaxLifetime(dataSource.getMaxLifetime());
        atomikosDataSourceBean.setBorrowConnectionTimeout(dataSource.getBorrowConnectionTimeout());
        atomikosDataSourceBean.setLoginTimeout(dataSource.getLoginTimeout());
        atomikosDataSourceBean.setMaintenanceInterval(dataSource.getMaintenanceInterval());
        atomikosDataSourceBean.setMaxIdleTime(dataSource.getMaxIdleTime());
        atomikosDataSourceBean.setTestQuery(dataSource.getTestQuery());

        return atomikosDataSourceBean;
    }

    @Bean("sqlSessionFactory2")
    public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean.getObject();
    }

    @Bean("sqlSessionTemplate2")
    public SqlSessionTemplate sqlSessionTemplate2(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory){
       SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
       return sqlSessionTemplate;
    }
}

5.启动配置

package com.kevin;

import com.kevin.datasource.DataSourceI;
import com.kevin.datasource.DataSourceII;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;

/**
 * Hello world!
 *
 */
//开启自动配置,springboot的核心配置
@EnableAutoConfiguration
//配置springboot扫描包的范围,通过指定扫包范围可以提高程序效率
@ComponentScan(basePackages = {"com.kevin.datasource","com.kevin.controller","com.kevin.exception","com.kevin.aop","com.kevin.service","com.kevin.entity","com.kevin.config"})
//开启异步
@EnableAsync
//开启数据源配置属性
@EnableConfigurationProperties({DataSourceI.class, DataSourceII.class})
//配置mybatis扫包范围
@MapperScan(value = {"com.kevin.mapper"})
public class App
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class,args);
    }
}

6.使用数据源+atomikos

package com.kevin.service.first;

import com.kevin.entity.User;
import com.kevin.mapper.first.UserMapper1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class UserService1 {

    @Autowired
    private UserMapper1 userMapper;

    public List<User> findUsers(){
        return userMapper.getUsers();
    }

    @Transactional
    public int addUser(int i,String username,String password){
        userMapper.addUser(username,password);
        i = 1/i;
        return 1;
    }
}
package com.kevin.service.second;

import com.kevin.entity.User;
import com.kevin.mapper.second.UserMapper2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class UserService2 {

    @Autowired
    private UserMapper2 userMapper;

    public List<User> findUsers(){
        return userMapper.findUsers();
    }


    @Transactional
    public int addUser(int i,String username,String password){
        userMapper.addUser(username,password);
        i=1/i;
        return 1;
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值