在Spring Boot中配置动态数据源需要以下步骤:
- 在pom.xml文件中添加以下依赖:
org.springframework.boot spring-boot-starter-jdbc org.apache.commons commons-dbcp2 2.9.0
- 创建DataSourceConfig类,用于配置数据源:
@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.slave") public DataSource slaveDataSource() { return DataSourceBuilder.create().build(); } @Bean @Primary public DynamicDataSource dataSource(DataSource masterDataSource, DataSource slaveDataSource) { Map
- 在application.properties文件中配置数据源的相关属性:
# 主数据源配置 spring.datasource.master.url = jdbc:mysql://localhost:3306/master_database spring.datasource.master.username = root spring.datasource.master.password = root # 从数据源配置 spring.datasource.slave.url = jdbc:mysql://localhost:3306/slave_database spring.datasource.slave.username = root spring.datasource.slave.password = root
- 创建DynamicDataSource类,用于动态切换数据源:
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSource(); } }
- 创建DataSourceContextHolder类,用于保存当前线程使用的数据源:
public class DataSourceContextHolder { private static final ThreadLocalCONTEXT_HOLDER = new ThreadLocal<>(); public static void setDataSource(String dataSource) { CONTEXT_HOLDER.set(dataSource); } public static String getDataSource() { return CONTEXT_HOLDER.get(); } public static void clearDataSource() { CONTEXT_HOLDER.remove(); } }
- 创建AopDataSourceAspect类,用于切换数据源:
@Aspect @Component public class AopDataSourceAspect { @Before("@annotation(com.example.dynamicdatasource.annotation.DataSource)") public void switchDataSource(JoinPoint point) { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); DataSource dataSource = method.getAnnotation(DataSource.class); if (dataSource == null) { DataSourceContextHolder.setDataSource("master"); } else { DataSourceContextHolder.setDataSource(dataSource.value()); } } @After("@annotation(com.example.dynamicdatasource.annotation.DataSource)") public void restoreDataSource(JoinPoint point) { DataSourceContextHolder.clearDataSource(); } }
- 在需要切换数据源的方法上添加
@DataSource
注解,如:
@DataSource("slave") public ListgetUsers() { // 查询从数据源 }
通过以上配置,就可以在Spring Boot中实现动态数据源的切换。