返回

干货!SpringBoot+MyBatis-Plus多数据源@DS注解失效的究极解决方法

后端

使用 @DS 注解实现 MyBatis-Plus 多数据源

一、简介

在使用 MyBatis-Plus 进行多数据源开发时,使用 @DS 注解可以指定数据源。但是,有时可能会遇到 @DS 注解失效的情况,导致数据操作始终指向默认数据源。本文将深入探讨 @DS 注解失效的原因以及如何解决此问题。

二、@DS 注解失效的根源

@DS 注解失效的原因主要有:

  1. DataSourceTransactionManager 未配置 :在使用 @DS 注解时,需要配置 DataSourceTransactionManager。如果没有配置,会导致 @DS 注解失效。
  2. @DS 注解的位置不正确 :@DS 注解需要放在方法或类上,并且必须放在 @Transactional 注解之前。
  3. 数据源配置不正确 :在配置数据源时,需要确保数据源的名称、URL、用户名、密码等信息正确无误。

三、@DS 注解失效的解决方法

针对上述原因,解决 @DS 注解失效的方法如下:

  1. 配置 DataSourceTransactionManager :在 application.yml 或 application.properties 文件中添加以下配置:
spring.transaction.default-timeout=30
spring.transaction.rollback-on-commit-failure=true
spring.transaction.rollback-on-system-exception=true
  1. 正确使用 @DS 注解 :@DS 注解需要放在方法或类上,并且必须放在 @Transactional 注解之前。示例:
@DS("slave_1")
@Transactional
public void saveUser(User user) {
    // 数据操作代码
}
  1. 检查数据源配置 :在 application.yml 或 application.properties 文件中检查数据源的配置,确保数据源的名称、URL、用户名、密码等信息正确无误。示例:
spring.datasource.master.url=jdbc:mysql://localhost:3306/master
spring.datasource.master.username=root
spring.datasource.master.password=123456

四、代码示例

以下是一个使用 @DS 注解实现多数据源的代码示例:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import javax.sql.DataSource;

@SpringBootApplication
public class MultiDataSourceApplication {

    public static void main(String[] args) {
        SpringApplication.run(MultiDataSourceApplication.class, args);
    }

    @Transactional
    public void saveUser(@DS("slave_1") BaseMapper<User> userMapper) {
        User user = new User();
        user.setName("张三");
        userMapper.insert(user);
    }

    @Bean
    public MybatisSqlSessionFactoryBean sqlSessionFactory(@Qualifier("slave_1") DataSource dataSource) {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }
}

五、常见问题解答

Q1:如何创建多个数据源?

A1:在 application.yml 或 application.properties 文件中配置多个数据源。

Q2:@DS 注解可以放在哪些位置?

A2:@DS 注解可以放在方法或类上。

Q3:@DS 注解失效时会有什么表现?

A3:数据操作始终指向默认数据源。

Q4:DataSourceTransactionManager 的作用是什么?

A4:DataSourceTransactionManager 用于管理事务。

Q5:如何配置 DataSourceTransactionManager?

A5:在 application.yml 或 application.properties 文件中添加 DataSourceTransactionManager 的配置。

六、总结

通过本文,你已经了解了 @DS 注解失效的原因以及如何解决此问题。掌握这些知识,你可以轻松实现数据隔离、读写分离、主从复制、负载均衡,让你的项目更加灵活、高效、可靠。