全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  千锋问答  >  详情

mybatisplus快速实现动态数据源切换

mybatisplus 匿名提问者2023-06-29

mybatisplus快速实现动态数据源切换

推荐答案

  在 MyBatis-Plus 中实现动态数据源切换可以通过以下步骤进行快速实现:

  1. 添加依赖:在项目的构建文件(如 Maven 的 pom.xml)中添加 MyBatis-Plus 的依赖项。

    com.baomidou
    mybatis-plus-boot-starter
    最新版本

   2. 配置数据源:在项目的配置文件中配置多个数据源。可以使用不同的数据库连接信息来配置不同的数据源。

spring:
  datasource:
    dynamic:
      primary: datasource1  # 指定默认的主数据源
      datasource:
        datasource1:
          url: jdbc:mysql://localhost:3306/db1
          username: root
          password: password1
        datasource2:
          url: jdbc:mysql://localhost:3306/db2
          username: root
          password: password2

   3. 创建数据源切换器:自定义一个数据源切换器,实现 `AbstractRoutingDataSource` 接口,并重写 `determineCurrentLookupKey` 方法,根据业务逻辑返回要使用的数据源的名称。

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        // 根据业务逻辑返回数据源的名称
        return DataSourceContextHolder.getDataSource();
    }
}

   4. 创建数据源上下文持有器:创建一个数据源上下文持有器类,用于存储当前线程使用的数据源名称。可以使用 `ThreadLocal` 来实现线程级别的数据源切换。

public class DataSourceContextHolder {
    private static final ThreadLocal contextHolder = new ThreadLocal<>();
    public static void setDataSource(String dataSourceName) {
        contextHolder.set(dataSourceName);
    }
    public static String getDataSource() {
        return contextHolder.get();
    }
    public static void clearDataSource() {
        contextHolder.remove();
    }
}

   5. 配置数据源切换:在 Spring 的配置文件中配置数据源切换器和数据源上下文持有器。

@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource() {
        return new DynamicDataSource();
    }
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        // 配置其他 MyBatis 相关设置
        return sessionFactory.getObject();
    }
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

   6. 使用注解切换数据源:在需要切换数据源的地方使用 `@DS` 注解指定要使用的数据源。

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    @DS("
datasource1")
 // 指定使用 datasource1 数据源
    public List getUsers() {
        return userMapper.selectList(null);
    }
    @Override
    @DS("datasource2") // 指定使用 datasource2 数据源
    public void addUser(User user) {
        userMapper.insert(user);
    }
}