spring boot+mybatis多数据源+jta事务

1.pom.xml文件

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </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-test</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>

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

    </dependencies>
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <!--打包时打包mapper.xml文件-->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*Mapper.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>

        </resources>
    </build>

2.application.yaml文件

server:
  port: 8088

## 配置数据源相关信息
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      ## 连接池配置
      filters: stat
      maxActive: 20
      initialSize: 1
      maxWait: 60000
      minIdle: 1
      timeBetweenEvictionRunsMillis: 60000
      minEvictableIdleTimeMillis: 300000
      validationQuery: select 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxOpenPreparedStatements: 20
      master:
        ## 数据源one配置
        url: jdbc:mysql://localhost:3306/master?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
      slave1:
        ## 数据源two配置
        url: jdbc:mysql://localhost:3306/slave?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
  druid: #druid监控页面用户名和密码
    name: admin
    pass: sailing123

## 该配置节点为独立的节点
mybatis:
  mapper-locations: classpath*:com/pb/modules/master/*.xml,classpath*:com/pb/modules/slave/*.xml


##打印sql日志
logging:
  level:
  ##mapper包路径
    com.pb.modules.master: debug

3.数据源配置

3.1主要数据源配置

@ConfigurationProperties(prefix = "spring.datasource.druid.master")
@Data
@Component("masterDbConfig")
public class MasterDbConfig {

    private String url;
    private String username;
    private String password;
    private String driverClassName;
}

3.2次数据源配置

@ConfigurationProperties(prefix = "spring.datasource.druid.slave1")
@Data
@Component("slave1DbConfig")
public class Slave1DbConfig {

    private String url;
    private String username;
    private String password;
    private String driverClassName;
}

3.3整合数据源配置

@MapperScans(
        {
                @MapperScan(basePackages = "com.pb.modules.master", sqlSessionTemplateRef = "masterSqlSessionTemplate"),
                @MapperScan(basePackages = "com.pb.modules.slave", sqlSessionTemplateRef = "slave1SqlSessionTemplate")
        }
)
@Configuration
public class MultipleDatasource {



    // 配置数据源
    @Primary
    @Bean(name = "masterDataSource")
    public DataSource testDataSource(@Qualifier("masterDbConfig") MasterDbConfig masterDbConfig) throws SQLException {
        // 创建MYsql实现XA规范的分布式数据源
        MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
        // 设置连接信息
        mysqlXaDataSource.setUrl(masterDbConfig.getUrl());
        mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
        mysqlXaDataSource.setPassword(masterDbConfig.getPassword());
        mysqlXaDataSource.setUser(masterDbConfig.getUsername());
        mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);

        // 数据源改为Atomikos,将事务交给Atomikos统一管理
        AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
        xaDataSource.setXaDataSource(mysqlXaDataSource);
        xaDataSource.setUniqueResourceName("masterDataSource");


        return xaDataSource;
    }

    @Bean(name = "masterSqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
       //此处指定别名,不知为何在配置文件中指定别名无效,所以在这里指定
        bean.setTypeAliasesPackage("com.pb.entity");
        return bean.getObject();
    }

    @Bean(name = "masterSqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(
            @Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }


    @Bean(name = "slave1DataSource")
    public DataSource slave1DataSource(@Qualifier("slave1DbConfig")Slave1DbConfig slave1DbConfig) throws SQLException {
        // 创建MYsql实现XA规范的分布式数据源
        MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
        // 设置连接信息
        mysqlXaDataSource.setUrl(slave1DbConfig.getUrl());
        mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
        mysqlXaDataSource.setPassword(slave1DbConfig.getPassword());
        mysqlXaDataSource.setUser(slave1DbConfig.getUsername());
        mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);

        // 数据源改为Atomikos,将事务交给Atomikos统一管理
        AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
        xaDataSource.setXaDataSource(mysqlXaDataSource);
        xaDataSource.setUniqueResourceName("slave1DataSource");


        return xaDataSource;
    }

    @Bean(name = "slave1SqlSessionFactory")
    public SqlSessionFactory slave1SqlSessionFactory(@Qualifier("slave1DataSource") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "slave1SqlSessionTemplate")
    public SqlSessionTemplate slave1SqlSessionTemplate(
            @Qualifier("slave1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }






}

4创建实体

@Data
public class Master {

    private Long id;
    private String name;

}

5创建Mapper及其xml文件

public interface MasterMapper  {

    void insertMaster(Master master);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pb.modules.master.MasterMapper" >


    <insert id="insertMaster" parameterType="master">
        insert into master(name) values (#{name})
    </insert>

</mapper>
public interface SlaveMapper {

    void insertSlave(Master master);
}

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pb.modules.slave.SlaveMapper" >


    <insert id="insertSlave" parameterType="com.pb.entity.Master">
   insert into slave(name) values (#{name})
    </insert>

</mapper>

6.创建Service

@Service
@Transactional//事务注解
public class CommonService {

    @Autowired
    MasterMapper masterMapper;

    @Autowired
    SlaveMapper slaveMapper;


    public  void insert(){
        Master master = new Master();
        master.setName("测试名字");

        masterMapper.insertMaster(master);
	//inc c = 10/0;
        slaveMapper.insertSlave(master);
    //    int c = 10/0;
    }
}

7.测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MultipleApplication.class)
public class MutipleTest {



    @Autowired
    CommonService commonService;

    @Test
    public void testServcie(){
        commonService.insert();
    }

}

到此,整个搭建过程完成。项目的目录结构如图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值