文章目录
-
-
-
- 添加依赖
-
- 配置数据源
-
- 示例配置:
-
- 创建数据源 Bean
-
- 创建动态数据源
-
- 配置 MyBatis SqlSessionFactory
-
- 在业务代码中使用
- 注意事项
-
-
在 Spring Boot 中配置 MyBatis 以支持多数据源涉及几个关键步骤,包括配置数据源、集成 MyBatis 以及动态数据源切换机制。以下是详细的配置步骤:
1. 添加依赖
确保你的项目中包含必要的依赖,例如 MySQL 驱动、Spring Boot Starter JDBC 或者 MyBatis 的相关依赖。
xml
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot JDBC Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MyBatis Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
2. 配置数据源
在 application.properties
或 application.yml
文件中添加每个数据源的配置信息。
示例配置:
properties
# 数据源1配置
spring.datasource.db1.url=jdbc:mysql://host1:3306/db1
spring.datasource.db1.username=user1
spring.datasource.db1.password=password1
spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源2配置
spring.datasource.db2.url=jdbc:mysql://host2:3306/db2
spring.datasource.db2.username=user2
spring.datasource.db2.password=password2
spring.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver
3. 创建数据源 Bean
在 Spring Boot 的配置类中,为每个数据源创建对应的 DataSource
Bean。
java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean(name = "db1")
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "db2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
}
4. 创建动态数据源
创建一个 DynamicDataSource
类来动态地改变当前线程绑定的数据源。
线程池切换范围在一个线程内, 如果涉及多个线程, 那么需要在线程范围内进行线程池切换
java
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
public class DynamicDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSource(String dataSourceName) {
CONTEXT_HOLDER.set(dataSourceName);
}
public static void clearDataSource() {
CONTEXT_HOLDER.remove();
}
@Override
protected Object determineCurrentLookupKey() {
return CONTEXT_HOLDER.get();
}
public void afterPropertiesSet() {
super.afterPropertiesSet();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("db1", db1DataSource);
targetDataSources.put("db2", db2DataSource);
setTargetDataSources(targetDataSources);
}
}
5. 配置 MyBatis SqlSessionFactory
配置 SqlSessionFactory
来使用动态数据源。
java
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.example.mapper")
public class MyBatisConfig {
@Autowired
private DataSource dynamicDataSource;
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dynamicDataSource);
factory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapper/*.xml"));
return factory.getObject();
}
}
6. 在业务代码中使用
在业务代码中使用之前定义的动态数据源,可以通过如下的方式直接切换数据源。也可以通过在方法上添加注解来指定使用哪个数据源,这里会涉及到切面的开发。
java
import com.example.datasource.DynamicDataSource;
public class Service {
@Transactional(readOnly = true)
public void serviceMethodForDb1() {
DynamicDataSource.setDataSource("db1");
// 操作 db1 数据源
DynamicDataSource.clearDataSource();
}
@Transactional(readOnly = true)
public void serviceMethodForDb2() {
DynamicDataSource.setDataSource("db2");
// 操作 db2 数据源
DynamicDataSource.clearDataSource();
}
}
注意事项
- 确保事务管理正确配置,特别是在涉及多个数据源的事务处理中。
- 数据源的选择逻辑应该清晰,并且易于维护。
- 考虑到性能问题,频繁的数据源切换可能会导致性能下降,因此要权衡利弊。
- 如果使用了事务管理器,请确保它支持多数据源场景下的事务处理。
以上步骤展示了如何在 Spring Boot 中配置 MyBatis 以支持多数据源。根据实际应用的需求,你可能需要调整某些配置细节。