自定义注解实现多数据源动态切换

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

背景

前几天在做数据表分库逻辑,需要前端传入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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值