多数据源整合的三种姿势,轻松搞定Springboot下的数据库切换!
2024-01-06 14:18:35
姿势一:AbstractRoutingDataSource
AbstractRoutingDataSource是Spring框架提供的一种便捷的多数据源解决方案 。它的工作原理是通过重写determineCurrentLookupKey()
方法来确定当前应该使用哪个数据源。这是一种简单易用的方法 ,但需要注意,它不适合高并发场景 ,因为它的性能会受到影响。
@Configuration
public class DataSourceConfig {
@Bean
public AbstractRoutingDataSource routingDataSource() {
AbstractRoutingDataSource routingDataSource = new AbstractRoutingDataSource();
routingDataSource.setTargetDataSources(targetDataSources());
routingDataSource.setDefaultTargetDataSource(defaultDataSource());
return routingDataSource;
}
@Bean
public Map<Object, Object> targetDataSources() {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("ds1", dataSource1());
targetDataSources.put("ds2", dataSource2());
return targetDataSources;
}
@Bean
public DataSource defaultDataSource() {
return dataSource1();
}
@Bean
public DataSource dataSource1() {
// 配置数据源1
return new DriverManagerDataSource();
}
@Bean
public DataSource dataSource2() {
// 配置数据源2
return new DriverManagerDataSource();
}
}
姿势二:MyBatis注册多个SqlSessionFactory
MyBatis可以通过注册多个SqlSessionFactory来实现多数据源。这种方法性能较好 ,但配置相对复杂 。
<!-- 配置数据源1 -->
<bean id="dataSource1" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db1" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
<!-- 配置数据源2 -->
<bean id="dataSource2" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db2" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
<!-- 配置SqlSessionFactory1 -->
<bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource1" />
</bean>
<!-- 配置SqlSessionFactory2 -->
<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource2" />
</bean>
姿势三:dynamic-datasource框架
dynamic-datasource框架是一个专门用于实现多数据源 的框架,它提供了开箱即用的解决方案 。使用它可以简化配置 ,并且性能较好 。
<!-- 配置dynamic-datasource -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.7.0</version>
</dependency>
<!-- 配置数据源1 -->
<bean id="dataSource1" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/db1" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
<!-- 配置数据源2 -->
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/db2" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
<!-- 配置dynamic-datasource -->
<bean id="dynamicDataSource" class="com.alibaba.druid.spring.boot.autoconfigure.DynamicDataSourceTransactionManager">
<property name="primary" value="dataSource1" />
<property name="dataSourceMap">
<map>
<entry key="dataSource1" value-ref="dataSource1" />
<entry key="dataSource2" value-ref="dataSource2" />
</map>
</property>
</bean>
选择最适合你的姿势
这三种实现多数据源的姿势各有优缺点。AbstractRoutingDataSource简单易用,但性能较差;MyBatis注册多个SqlSessionFactory性能较好,但配置复杂;dynamic-datasource框架使用方便,性能较好,是最佳选择。
根据你的实际需求,选择最适合你的姿势吧!
常见问题解答
- 为什么需要使用多数据源?
多数据源可以帮助我们将不同的数据源分离开来,比如:将用户数据和日志数据分存到不同的数据库中。这样可以提高系统的安全性、可扩展性和性能。
- AbstractRoutingDataSource和dynamic-datasource有什么区别?
AbstractRoutingDataSource是Spring框架提供的实现多数据源的组件,而dynamic-datasource是一个第三方框架。dynamic-datasource框架提供了更多的功能和更友好的配置,并且性能也更好。
- 在选择多数据源方案时,需要注意哪些因素?
在选择多数据源方案时,需要考虑以下因素:
* **性能:** 多数据源方案的性能至关重要,需要选择性能较好的方案。
* **可扩展性:** 多数据源方案应该具有良好的可扩展性,以满足业务发展的需要。
* **安全性:** 多数据源方案需要保证数据的安全性,防止数据泄露。
* **易用性:** 多数据源方案应该易于使用,配置和维护简单。
- dynamic-datasource框架有哪些优势?
dynamic-datasource框架的主要优势包括:
* **开箱即用:** 无需复杂配置,即可实现多数据源。
* **性能优异:** 基于ThreadLocal实现,性能开销小。
* **扩展性强:** 支持多种数据源类型,并提供丰富的扩展接口。
* **故障隔离:** 每个数据源独立管理,故障不会影响其他数据源。
- 如何在项目中使用dynamic-datasource框架?
在项目中使用dynamic-datasource框架非常简单,只需要以下几步:
* 引入dynamic-datasource框架的依赖。
* 配置数据源和dynamic-datasource。
* 在需要使用多数据源的地方,通过`@DS`注解指定数据源。