<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version>
</dependency>
1.使用mybatis-plus 如何配置多数据源,application-local.yml配置如下
spring:datasource:dynamic:# 是否开启 SQL日志输出,生产环境建议关闭,有性能损耗p6spy: truehikari:connection-timeout: 30000max-lifetime: 1800000max-pool-size: 15min-idle: 5connection-test-query: select 1pool-name: OpsHikariCP# 配置默认数据源primary: basedatasource:# 数据源-1,名称为 basebase:username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/smart_ops?characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2b8# 数据源-2,名称为 quartzquartz:username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:/127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2b8
@DS和@DSTransactional都是Spring-boot-datasource-dynamic包下的
1.@DS(“quartz”)注解只用支持多数据源切换
操作数量少,单张表(增、删、改)包括批量操作,可以使用组合使用
一般会在主数据库,进行修改数据,然后开启食物
@DS("xxx")
@Transactional(rollbackFor = Exception.class)
2.@DSTransactional使用
操作数量多,操作多张表使用或者动态数据源切换下的事务
@DSTransactional 多数据源事务的开启注解
1、一个方法中使用同一个数据源;
2、一个方法中使用了多个数据源;
dao层
package com.test.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
//数据源1
@DS("db1")
@Mapper
public interface Test1Dao {@Update("update test1 set name = #{name} where id = #{id}")void updateById(@Param("id")Integer id, @Param("name")String name);
}package com.test.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.test.datasources.DataSourceNames;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
//数据源2
@DS(“db2”)
@Mapper
public interface Test2Dao {@Update("update test2 set name = #{name} where id = #{id}")void updateById(@Param("id")Integer id, @Param("name")String name);
}
service层
package com.test.service;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.test.mapper.Test1Dao;
import com.test.mapper.Test2Dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class TestService {@Autowiredprivate Test1Dao test1Dao;@Autowiredprivate Test2Dao test2Dao;/*** 同一个数据源中的事务,都是数据源2* 这里用的是spring的事务注解Transactional* 这里必须加上注解多数据源注解@DS("db2"),否则使用的是默认数据源*/@DS("db2")@Transactionalpublic void theSame() {test2Dao.updateById(2,"第一次修改");test2Dao.updateById(2,"第二次修改");//这里报错回滚int i = 1/0;}/*** 多数据源中的事务,同时使用数据源1、2* 如果这里用spring的事务注解Transactional,那么使用的是默认数据源* 这里不需要加上注解@DS*/@DSTransactionalpublic void notAlike() {test1Dao.updateById(1,"第一次修改");test2Dao.updateById(2,"第二次修改");//这里报错回滚int i = 1/0;}
}
3.不能混用
@Transactional、@DSTransactional两者都可以控制事务处理。但不能混用!尤其是在多数据源的情况下,可能会造成事务死锁。
public AService {@Resourceprivate BService bservice;@DSTransactionalpublic void complete(...) {// 其它操作bservice.updateBusiness();}
}public BService {@Transactional(rollback = Throwable.class)public void updateBusiness(...) {// 其它操作}
}
Spring Boot多数据源事务@DSTransactional的使用