springboot mybatis 动态切换数据源
springboot mybatis 动态切换数据源
一般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); // 恢复到默认的数据源
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)