一般pom配置

<dependencies>
    <!-- MyBatis 核心依赖 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    
    <!-- MySQL 数据库驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
    </dependency>
    
    <!-- Oracle 数据库驱动 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>21.3.0.0</version>
    </dependency>
</dependencies>

下面代码的是来自chatgpt回复

首先,需要定义两个数据源:

@Configuration
public class DataSourceConfig {
    
    @Bean
    @ConfigurationProperties("spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    @ConfigurationProperties("spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

在上面的代码中,我们使用 @ConfigurationProperties 注解来读取 application.yml 配置文件中的数据源配置,创建对应的 DataSource 对象。

接下来,需要定义一个动态数据源,根据需要切换到不同的数据源:

public class DynamicDataSource extends AbstractRoutingDataSource {
    
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceKey();
    }
}

在上面的代码中,我们通过继承 AbstractRoutingDataSource 类来实现动态数据源。其中,determineCurrentLookupKey() 方法用于获取当前需要使用的数据源的标识符。

接下来,需要定义一个数据源上下文,用于在不同的线程中存储当前使用的数据源的标识符:

在上面的代码中,我们使用 ThreadLocal 来存储当前线程使用的数据源的标识符。

public class DataSourceContextHolder {
    
    private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<>();
    
    public static String getDataSourceKey() {
        return dataSourceKey.get();
    }
    
    public static void setDataSourceKey(String key) {
        dataSourceKey.set(key);
    }
    
    public static void clearDataSourceKey() {
        dataSourceKey.remove();
    }
}

最后,需要配置 MyBatis 和 Spring Boot,使其使用动态数据源:

public class DataSourceContextHolder {
    
    private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<>();
    
    public static String getDataSourceKey() {
        return dataSourceKey.get();
    }
    
    public static void setDataSourceKey(String key) {
        dataSourceKey.set(key);
    }
    
    public static void clearDataSourceKey() {
        dataSourceKey.remove();
    }
}

在上面的代码中,我们首先使用 @Primary 注解来指定默认的数据源。然后,使用 DynamicDataSource 类来创建一个动态数据源,将所有数据源添加到该动态数据源中。最后,将该动态数据源配置为 Spring Boot 的默认数据源。

通过上述代码,可以在运行时动态切换不同的数据源。例如,可以使用以下代码来切换到名为 "secondary" 的数据源:

DataSourceContextHolder.setDataSource("secondary");
public class DynamicDataSource extends AbstractRoutingDataSource {
    private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<>();

    public static void setDataSourceKey(String key) {
        dataSourceKey.set(key);
    }

    @Override
    protected Object determineCurrentLookupKey() {
        return dataSourceKey.get();
    }
}

// 在具体的数据访问代码中,可以这样使用:
DynamicDataSource.setDataSourceKey("dataSource1"); // 切换到 dataSource1
User user1 = userDao.findById(1L); // 使用 dataSource1 访问
DynamicDataSource.setDataSourceKey("dataSource2"); // 切换到 dataSource2
User user2 = userDao.findById(1L); // 使用 dataSource2 访问
DynamicDataSource.setDataSourceKey(null); // 恢复到默认的数据源

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐