什么是多数据源支持?

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

实现原理

单个数据源在配置时会绑定一套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 就可以了,只是操作的是不同的数据库。

SpringBoot+mybatis实现多数据源支持的更多相关文章

  1. SpringBoot+MyBatis配置多数据源

    SpringBoot 可以支持多数据源,这是一个非常值得学习的功能,但是从现在主流的微服务的架构模式中,每个应用都具有唯一且准确的功能,多数据源的需求很难用到,考虑到实际情况远远比理论复杂的多,这里还 ...

  2. springboot+mybatis集成多数据源MySQL/Oracle/SqlServer

    日常开发中可能时常会遇到一些这样的需求,业务数据库和第三方数据库,两个或多个数据库属于不同数据库厂商,这时候就需要通过配置来实现对数据库实现多源处理.大致说一下我的业务场景,框架本身是配置的sprin ...

  3. 记录一下自己搭建springboot+mybatis+druid 多数据源的过程

    前言  上次的一个项目(springboot+mybatis+vue),做到后面的时间发现需要用到多数据源.当时没有思路..后来直接用了jdbc来实现.这几天不是很忙,所以决定自己再搭建一次.不多说, ...

  4. springboot + mybatis配置多数据源示例

    转:http://www.jb51.net/article/107223.htm 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)Datab ...

  5. 基于注解的springboot+mybatis的多数据源组件的实现

    通常业务开发中,我们会使用到多个数据源,比如,部分数据存在mysql实例中,部分数据是在oracle数据库中,那这时候,项目基于springboot和mybatis,其实只需要配置两个数据源即可,只需 ...

  6. springboot mybatis 使用多数据源

    SpringBoot系列博客目录,含1.5.X版本和2.X版本 springboot2.0正式版发布之后,很多的组件集成需要变更了,这次将多数据源的使用踩的坑给大家填一填.当前多数据源的主要为主从库, ...

  7. SpringBoot+Mybatis 实现动态数据源切换方案

    背景 最近让我做一个大数据的系统,分析了一下,麻烦的地方就是多数据源切换抽取数据.考虑到可以跨服务器跨数据库抽数,再整理数据,就配置了这个动态数据源的解决方案.在此分享给大家. 实现方案 数据库配置文 ...

  8. springboot mybatis plus多数据源轻松搞定 (上)

    在开发中经常会遇到一个程序需要调用多个数据库的情况,总得来说分为下面的几种情况: 一个程序会调用不同结构的两个数据库. 读写分离,两个数据结构可能一样高,但是不同的操作针对不同的数据库. 混合情况,既 ...

  9. SpringBoot MyBatis 配置多数据源 (静态多个)

    转载地址:https://www.jianshu.com/p/118ca1d5ecf9?utm_campaign=haruki&utm_content=note&utm_medium= ...

随机推荐

  1. eclipse/STS 提升注解提示速度

    window -- preference -- 输入content -- java -- editor -- content Assist --auto delay 选项 改为100或者更低  提示速 ...

  2. 阿里JAVA开发面试常问问题总结2

    线程与进程 进程是可并发运行的程序在某个数据集合上的一次计算活动.也是操作系统进行资源分配和调度的基本单位. 线程是操作系统进程中能够并发运行的实体,是处理器调度和分派的基本单位. 每一个进程内可包括 ...

  3. Android学习笔记三:用Intent串联activity

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7513399.html 一:Intent Intent可以理解为 意图. 我们可以通过创建intent实例来定义 ...

  4. JS 拦截/捕捉 全局错误 全局Error onerror

    移动Web开发过程中,在真机测试时,往往会遇到一些PC调试无法重现的问题,这时候我们需要在手机上拦截错误,并有相应的输出. 公司和网上都有类似的工具/类库,但如果纯粹一个简单的调试,或许不需要引入工具 ...

  5. 【Fanvas技术解密】HTML5 canvas实现脏区重绘

    先说明一下,fanvas是笔者在企鹅公司开发的,即将开源的flash转canvas工具. 脏区重绘(dirty rectangle)并不是一门新鲜的技术了,这在最早2D游戏诞生的时候就已经存在. 复杂 ...

  6. mysql取电话号码的后四位字符

    SELECT id, RIGHT (phone,4)  from user  where  id= 'xxxxxx'

  7. django之创建站点之基本流程

    创建工程: 1.在D盘下创建一个文件夹名为djangoweb,切换到文件夹所在目录 C:\Administrator>d: D:\>cd d:\djangoweb 2.创建工程(成功没有提 ...

  8. Shell日期处理

    在类Unix系统中,日期被存储成一个整数,其大小为自世界标准时间(UTC)①1970年1月1日0时0分0秒②起所流逝的秒数.这种计时方式称为纪元时或Unix时间.(1) 读取日期:[root@serv ...

  9. sparkmllib矩阵向量

    Spark MLlib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/Matrix的实现以及相应计算的接口(Linalg).但是在MLlib里面同时也提供了Vector和L ...

  10. 如何解决input file 选取相同文件后,change事件不起作用解决方法

    两种方法 1.在你的input所属的form表单reset()就可以了! $("#avatorForm")[0].reset(); 2.设置你的input file value值为 ...