QQ扫一扫联系
在Spring Boot应用程序中,使用多个数据源是一项常见的需求,特别是在涉及多个数据库的复杂业务场景中。为了有效地管理和使用这些数据源,通常需要配置动态数据源。本文将介绍如何在Spring Boot项目中结合MyBatis和Druid配置动态数据源,以便根据需要切换数据库连接。
首先,您需要在项目的pom.xml文件中添加必要的依赖项。在这个示例中,我们将使用MyBatis和Druid作为数据源:
<!-- MyBatis依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- Druid依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
接下来,您需要配置数据源。在application.properties或application.yml文件中添加数据库连接信息,例如:
spring:
datasource:
# 默认数据源
primary:
url: jdbc:mysql://localhost:3306/db1
username: user1
password: password1
# 第二个数据源
secondary:
url: jdbc:mysql://localhost:3306/db2
username: user2
password: password2
现在,创建一个配置类来配置动态数据源。您可以使用Spring的@Configuration注解和@Bean注解来实现:
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DynamicDataSourceConfig {
@Bean
@Primary
public DataSource dynamicDataSource() {
AbstractRoutingDataSource dataSource = new DynamicRoutingDataSource();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("primary", primaryDataSource());
targetDataSources.put("secondary", secondaryDataSource());
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(primaryDataSource());
return dataSource;
}
@Bean
public DataSource primaryDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
public DataSource secondaryDataSource() {
return DruidDataSourceBuilder.create().build();
}
}
在上面的示例中,我们创建了一个DynamicDataSourceConfig类,定义了两个数据源:primaryDataSource和secondaryDataSource。我们还创建了一个dynamicDataSource,并将这两个数据源添加到其中。
为了实现动态数据源的切换,您需要创建一个动态数据源路由类。这个类需要继承AbstractRoutingDataSource,并重写determineCurrentLookupKey()方法来决定当前使用的数据源:
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSourceKey();
}
}
为了在运行时选择数据源,您需要创建一个动态数据源上下文类。这个类可以使用ThreadLocal来存储当前数据源的标识符。
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSourceKey(String dataSourceKey) {
CONTEXT_HOLDER.set(dataSourceKey);
}
public static String getDataSourceKey() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSourceKey() {
CONTEXT_HOLDER.remove();
}
}
最后,配置MyBatis以使用动态数据源。在MyBatis的配置文件中,您可以使用${}来引用数据源的标识符。
<!-- MyBatis配置文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 其他配置 -->
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource">
<property name="defaultTargetDataSource" ref="primaryDataSource"/>
<property name="targetDataSources">
<map>
<entry key="primary" value-ref="primaryDataSource"/>
<entry key="secondary" value-ref="secondaryDataSource"/>
</map>
</property>
</bean>
现在,您可以在运行时切换数据源,例如:
// 切换到primary数据源
DynamicDataSourceContextHolder.setDataSourceKey("primary");
// 执行数据库操作
myService.someDatabaseOperation();
// 切换到secondary数据源
DynamicDataSourceContextHolder.setDataSourceKey("secondary");
// 执行数据库操作
myService.someDatabaseOperation();
// 清除数据源设置,将使用默认数据源
DynamicDataSourceContextHolder.clearDataSourceKey();
通过调用DynamicDataSourceContextHolder.setDataSourceKey()方法,您可以在不同的业务逻辑中动态切换数据源。
在Spring Boot项目中,结合MyBatis和Druid配置动态数据源是一项强大的功能,允许您有效地管理多个数据源并在运行时进行切换。通过按照上述步骤配置,您可以轻松实现这一功能,以满足不同业务需求。务必根据您的项目需求和性能考虑来选择合适的数据源切换策略,以确保应用程序的稳定性和性能。