背景
前几天在做数据表分库逻辑,需要前端传入dbName实现自由选择数据源的分库逻辑。本打算集成MyBatis-Plus提供的dynamic-datasource工具包,但是数据源配置都写死在了yml里,而公司的项目是基于微服务的,配置类都统一访问远程配置中心获取,于是只能利用AOP在service层做拦截,自己造轮子实现分库逻辑,过程如下:
1、注册多数据源:
@Configuration
@ImportResource("classpath:mybatis/spring-mybatis.xml")
public class DataSourceConfig {
@Bean(name = "DataSource1")
@Qualifier("DataSource1")
@Primary
public DataSource DataSource1() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/datasource1?characterEncoding=UTF8&useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("");
return dataSource;
}
@Bean(name = "DataSource2")
@Qualifier("DataSource2")
public DataSource DataSource2() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/datasource2?characterEncoding=UTF8&useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("");
return dataSource;
}
// hashmap存放多数据源
@Bean(name = "dynamicDataSource")
public DataSource dynamicDataSource(@Autowired @Qualifier("DataSource1") DataSource primary, @Autowired @Qualifier("DataSource2") DataSource ds2) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
// 默认数据源
dynamicDataSource.setDefaultTargetDataSource(primary);
// 配置多数据源
Map<Object, Object> dsMap = new HashMap<Object, Object>(2);
dsMap.put("DataSource1", primary);
dsMap.put("DataSource2", ds2);
dynamicDataSource.setTargetDataSources(dsMap);
return dynamicDataSource;
}
@Bean
public PlatformTransactionManager txManager(DataSource dynamicDataSource) {
return new DataSourceTransactionManager(dynamicDataSource);
}
}
2、在spring配置文件中配置这两个数据源
核心配置项如下:
<!-- dynamicDataSource -->
<bean id="dataSource" class="com.douyu.ocean.dataworks.vienna.core.config.DynamicDataSource">
<!-- 为targetDataSources注入两个数据源 -->
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="ds1" value-ref="DataSource1"/>
<entry key="ds2" value-ref="DataSource2"/>
</map>
</property>
<!-- 为指定数据源RoutingDataSource注入默认的数据源-->
<property name="defaultTargetDataSource" ref="DataSource1"/>
</bean>
<!-- sql session factory bean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" primary="true">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:mybatis/mapper/*Mapper.xml"/>
<propert

本文介绍了一种在微服务架构下,利用自定义注解和AOP结合SPEL表达式实现多数据源动态切换的方法。通过在方法上添加@DS注解并指定数据源名称,可以实现不同数据源之间的灵活切换。
最低0.47元/天 解锁文章
1845

被折叠的 条评论
为什么被折叠?



