<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: true
hikari:
connection-timeout: 30000
max-lifetime: 1800000
max-pool-size: 15
min-idle: 5
connection-test-query: select 1
pool-name: OpsHikariCP
# 配置默认数据源
primary: base
datasource:
# 数据源-1,名称为 base
base:
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/smart_ops?characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2b8
# 数据源-2,名称为 quartz
quartz:
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: 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 {
@Autowired
private Test1Dao test1Dao;
@Autowired
private Test2Dao test2Dao;
/**
* 同一个数据源中的事务,都是数据源2
* 这里用的是spring的事务注解Transactional
* 这里必须加上注解多数据源注解@DS("db2"),否则使用的是默认数据源
*/
@DS("db2")
@Transactional
public void theSame() {
test2Dao.updateById(2,"第一次修改");
test2Dao.updateById(2,"第二次修改");
//这里报错回滚
int i = 1/0;
}
/**
* 多数据源中的事务,同时使用数据源1、2
* 如果这里用spring的事务注解Transactional,那么使用的是默认数据源
* 这里不需要加上注解@DS
*/
@DSTransactional
public void notAlike() {
test1Dao.updateById(1,"第一次修改");
test2Dao.updateById(2,"第二次修改");
//这里报错回滚
int i = 1/0;
}
}
3.不能混用
@Transactional、@DSTransactional两者都可以控制事务处理。但不能混用!尤其是在多数据源的情况下,可能会造成事务死锁。
public AService {
@Resource
private BService bservice;
@DSTransactional
public void complete(...) {
// 其它操作
bservice.updateBusiness();
}
}
public BService {
@Transactional(rollback = Throwable.class)
public void updateBusiness(...) {
// 其它操作
}
}
Spring Boot多数据源事务@DSTransactional的使用