谈一谈Spring-Mybatis在多数据源配置上的坑

概述

先聊一聊业务背景,随着系统服务的不断开发,我们的系统会充斥着各种个样的业务.这种时候,我们应该要开始考虑一下如何将系统的粒度细化.举个常见的例子: 电商系统可以拆分为 商品模块,订单模块,地址模块等等.这些模块都可以独立抽取出来,形成一个单独的服务.这就会涉及到各个模块之间的通信问题,一些简单的服务,我们可以通过rpc接口 直接进行通信,但是有些服务却不适用这种模式.本文主要讲一下在多数据源路上遇到的一些坑.

多数据源

13465705-ef4b5035cd3aefd8.png

项目结构

13465705-8d6057916ce869dc.png

配置文件: DataSourceConfig

@Bean(name = "masterDataSource")

    @Qualifier("masterDataSource")

    @ConfigurationProperties(prefix = "spring.datasource")

    public DataSource masterDataSource() {

        return DataSourceBuilder.create().build();

    }

    @Bean(name = "slaveDataSource")

    @Qualifier("slaveDataSource")

    @ConfigurationProperties(prefix = "spring.datasource.db2")

    public DataSource slaveDataSource() {

        return DataSourceBuilder.create().build();

    }

    @Bean

    @Primary

    public DynamicDataSource dataSource(@Qualifier("masterDataSource") DataSource master,

                                        @Qualifier("slaveDataSource") DataSource slave) {

        Map<Object, Object> targetDataSources = new HashMap<>();

        targetDataSources.put(DatabaseType.db1, master);

        targetDataSources.put(DatabaseType.db2, slave);

        DynamicDataSource dataSource = new DynamicDataSource();

        dataSource.setTargetDataSources(targetDataSources);// 该方法是AbstractRoutingDataSource的方法

        dataSource.setDefaultTargetDataSource(master);// 默认的datasource设置为myTestDbDataSource

        return dataSource;

    }

    @Bean

    public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource myTestDbDataSource,

                                              @Qualifier("slaveDataSource") DataSource myTestDb2DataSource) throws Exception {

        SqlSessionFactoryBean fb = new SqlSessionFactoryBean();

        fb.setDataSource(this.dataSource(myTestDbDataSource, myTestDb2DataSource));

        fb.setTypeAliasesPackage(env.getProperty("mybatis.type-aliases-package"));

        fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));

        return fb.getObject();

    }

数据库

test_1:

CREATE TABLE `school` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `school_name` varchar(255) DEFAULT NULL,

  `province` v

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值