前言:
上周在工作中,老大给了个需求让我在项目中去操作两个数据源(来自来台服务器的库) ,并且测试一下他们在写入操作的时候失败的事务问题解决方案
pom依赖:mybatis-plus动态数据源
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.2.1</version>
</dependency>
application.yml配置文件 这里我使用的mysql数据库
spring:
#使用druid连接池
datasource:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
initial-size: 50
min-idle: 50
max-active: 100
max-wait: 60000
time-between-eviction-runs-millis: 60000
dynamic:
primary: master
datasource:
master:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.0.1:3306/db1?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: 111111
slave:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.0.2:3306/db2?
useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: 111111
可以看到这里我们配置了一个主数据源 master 192.168.0.1:3306/db1
mapper @DS()注解来读取配置文件中配置的数据源
@Mapper
@DS("slave") // 通过DS来标注切换数据源
public interface AdminUserMapper2 extends BaseMapper<AdminUser> {
}
service 加上@TransactionrollbackFor = Exception.class()注解可以解决事务问题
@Service
public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser> implements AdminUserService {
@Autowired
private AdminUserMapper adminUserMapper;
@Autowired
private AdminUserMapper2 adminUserMapper2;
@Autowired
private StudentMapper studentMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public boolean add(AdminUser adminUser) {
adminUserMapper.insert(adminUser);
add2(adminUser); //不同数据源
// add3(); //同数据源不同库
return true;
}
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
public boolean add2(AdminUser adminUser) {
adminUser.setOperNo("operNo2");
adminUser.setStatus(1);
adminUser.setUserName("userName2");
adminUserMapper2.insert(adminUser);
int a = 1/0;
return true;
}
public boolean add3() {
Student student = new Student();
student.setOperNo("operNo2");
student.setStatus(1);
student.setUserName("userName2");
studentMapper.insert(student);
int a = 1/0;
return true;
}
}
总结:其实就是用到了mybatis-plus中的动态数据切换,了解yml配置,@DS注解就好,记录一下以免以后遇到