zoukankan      html  css  js  c++  java
  • SpringBoot+mybatis实现多数据源支持

    什么是多数据源支持?

    简单的说,就是一个项目里,同时可以访问多个不同的数据库

    实现原理

    单个数据源在配置时会绑定一套mybatis配置,多个数据源时,不同的数据源绑定不同的mybatis配置就可以了,简单的思路就是让不同的数据源扫描不同的包,让不同的包下的mapper对应连接不同的数据源去处理逻辑

    业务场景假设

    项目底层有正常业务库和日志库,希望解决的是将项目中的一些日志单独记录到一个库里,比如用户操作记录、产品更新记录等。

    说一下为什么会有这个需求:用户操作记录和产品更新记录可能很多,而实际中使用的又很少,就只是在某些页面单独展示一下操作或更新记录,绝大部分时间都在不停的做着插入操作,这时就可以把这种记录放到业务核心库外面。

    实现步骤

    1.定义多个数据源的mybatis配置

    application.properties 
    
    mybatis.mapper-locations=mappers/*.xml
    mybatisLog.mapper-locations=mappersLog/*.xml
    
    ## datasource master #
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test1?characterEncoding=UTF-8
    spring.datasource.username=root
    spring.datasource.password=466420182
    
    ## datasource log #
    spring.datasourceLog.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasourceLog.driver-class-name=com.mysql.jdbc.Driver
    spring.datasourceLog.url=jdbc:mysql://localhost:3306/log?characterEncoding=UTF-8
    spring.datasourceLog.username=root
    spring.datasourceLog.password=466420182

    2.定义多个数据源

    @Configuration
    public class DatasourceConfig {
    
        @Bean(destroyMethod =  "close", name = DataSources.MASTER_DB)
        @ConfigurationProperties(prefix = "spring.datasource")
        public DataSource dataSource() {
            return DataSourceBuilder.create().type(DruidDataSource.class).build();
        }
    
        @Bean(destroyMethod =  "close", name = DataSources.LOG_DB)
        @ConfigurationProperties(prefix = "spring.datasourceLog")
        public DataSource dataSourceLog() {
            return DataSourceBuilder.create().type(DruidDataSource.class).build();
        }
    }

    3.分别配置多个数据源

    @Configuration
    @MapperScan(basePackages = {"com.mmall.practice.dao"})
    public class MybatisConfig {
    
        @Autowired
        @Qualifier(DataSources.MASTER_DB)
        private DataSource masterDB;
    
        @Bean
        @Primary
        @ConfigurationProperties(prefix = "mybatis")
        public SqlSessionFactoryBean sqlSessionFactoryBean() {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(masterDB);
            return sqlSessionFactoryBean;
        }
    }
    @Configuration
    @MapperScan(basePackages = {"com.mmall.practice.daoLog"}, sqlSessionFactoryRef = "logSqlSessionFactory")
    public class MybatisLogConfig {
    
        @Autowired
        @Qualifier("logDB")
        private DataSource logDB;
    
        @Bean(name = "logSqlSessionFactory")
        @ConfigurationProperties(prefix = "mybatisLog")
        public SqlSessionFactoryBean sqlSessionFactoryBean() {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(logDB);
            return sqlSessionFactoryBean;
        }
    }

    这里需要注意两个数据源配置的差别,也是支持多数据源的关键

    • 1)Configuration 扫描不同的前缀,取不同包下的sql对应的xml文件
    • 2)SqlSessionFactoryBean 实例化时,默认的额外添加了 @Primary注解
    • 3)MapperScan 扫描的不同的包,如果扫描相同的包也能做,但是还需要做额外的配置,可以自己尝试
    • 4)不同的数据源使用不同的SqlSessionFactoryBean实例

    至此,不同包下面的 Mapper.java 文件就可以连接不同的数据源了。这里就不说如何去使用了,和之前正常一样去使用 Mapper.java 就可以了,只是操作的是不同的数据库。

  • 相关阅读:
    September 29th 2017 Week 39th Friday
    September 28th 2017 Week 39th Thursday
    September 27th 2017 Week 39th Wednesday
    September 26th 2017 Week 39th Tuesday
    September 25th 2017 Week 39th Monday
    September 24th 2017 Week 39th Sunday
    angular2 学习笔记 ( Form 表单 )
    angular2 学习笔记 ( Component 组件)
    angular2 学习笔记 ( Http 请求)
    angular2 学习笔记 ( Router 路由 )
  • 原文地址:https://www.cnblogs.com/shamo89/p/10032390.html
Copyright © 2011-2022 走看看