SpringBoot - 多个数据源的轻松支持

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: SpringBoot - 多个数据源的轻松支持

前面文章里介绍了 SpringBoot - 自定义注解完成数据库切库,今天接着这个高并发的话题,继续说一下项目里多个数据源的支持。

如何理解支持多个数据源呢?简单的说,就是一个项目里,同时可以访问多个不同的数据库。

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

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

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

自己还遇到一个场景,就是底层产品、订单什么的是存在不同的库里的,但是代码重构还没做到产品相关的一个项目、订单相关的一个项目这一步,这时候也可以考虑在一个项目里同时支持多个数据源,订单相关的类操作订单库,产品相关的类操作产品库,前期做好配置就可以了,尽量别去跨库join表,基本什么都不影响。

不多说了,代码走起来 : (依旧使用springboot进行实现)

第一步、定义多个数据源的mybatis配置

application.propertiesmybatis.mapper-locations=mappers/*.xmlmybatisLog.mapper-locations=mappersLog/*.xml## datasource master #spring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/test1?characterEncoding=UTF-8spring.datasource.username=rootspring.datasource.password=466420182## datasource log #spring.datasourceLog.type=com.alibaba.druid.pool.DruidDataSourcespring.datasourceLog.driver-class-name=com.mysql.jdbc.Driverspring.datasourceLog.url=jdbc:mysql://localhost:3306/log?characterEncoding=UTF-8spring.datasourceLog.username=rootspring.datasourceLog.password=466420182

第二步、定义多个数据源

@ConfigurationpublicclassDatasourceConfig {
@Bean(destroyMethod="close", name=DataSources.MASTER_DB)
@ConfigurationProperties(prefix="spring.datasource")
publicDataSourcedataSource() {
returnDataSourceBuilder.create().type(DruidDataSource.class).build();
    }
@Bean(destroyMethod="close", name=DataSources.LOG_DB)
@ConfigurationProperties(prefix="spring.datasourceLog")
publicDataSourcedataSourceLog() {
returnDataSourceBuilder.create().type(DruidDataSource.class).build();
    }
}

第三步、分别配置多个数据源

@Configuration@MapperScan(basePackages= {"com.mmall.practice.dao"})
publicclassMybatisConfig {
@Autowired@Qualifier(DataSources.MASTER_DB)
privateDataSourcemasterDB;
@Bean@Primary@ConfigurationProperties(prefix="mybatis")
publicSqlSessionFactoryBeansqlSessionFactoryBean() {
SqlSessionFactoryBeansqlSessionFactoryBean=newSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(masterDB);
returnsqlSessionFactoryBean;
    }
}
@Configuration@MapperScan(basePackages= {"com.mmall.practice.daoLog"}, sqlSessionFactoryRef="logSqlSessionFactory")
publicclassMybatisLogConfig {
@Autowired@Qualifier("logDB")
privateDataSourcelogDB;
@Bean(name="logSqlSessionFactory")
@ConfigurationProperties(prefix="mybatisLog")
publicSqlSessionFactoryBeansqlSessionFactoryBean() {
SqlSessionFactoryBeansqlSessionFactoryBean=newSqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(logDB);
returnsqlSessionFactoryBean;
    }
}

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

1)Configuration 扫描不同的前缀,取不同包下的sql对应的xml文件

2)SqlSessionFactoryBean 实例化时,默认的额外添加了 @Primary注解

3)MapperScan 扫描的不同的包,如果扫描相同的包也能做,但是还需要做额外的配置,可以自己尝试

4)不同的数据源使用不同的SqlSessionFactoryBean实例

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

多数据源支持是不是特别简单,赶紧在你的项目里用起来吧~

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
存储 Java 数据库
Springboot 支持Emoji 表情
Springboot 支持Emoji 表情
350 0
Springboot 支持Emoji 表情
|
SQL 监控 druid
SpringBoot:配置数据源详解
SpringBoot:配置数据源详解
SpringBoot:配置数据源详解
|
安全 Java 关系型数据库
Mall电商实战项目全面升级!支持最新版SpringBoot,干掉循环依赖
技术栈升级 mall项目采用现阶主流技术实现,这些主流技术基本都升级了目前最新稳定版,具体升级内容大家可以参考下表。 技术版本说明
|
前端开发 Java Maven
SpringBoot2.x系列教程09--SpringBoot中支持jsp页面
前言 在上一章节中,壹哥 跟大家讲过现在项目比较流行的开发模式,稍微大点的项目一般都是采用前后端分离的开发模式。如果我们的项目采用的是前后端不分离的模式,在SpringBoot中推荐我们使用Themeleaf模板来作为页面。 但是咱们都知道,Spring MVC中是支持JSP的,但是在Spring Boot中,其实不建议我们使用JSP。因为SpringBoot自带的嵌入式servlet容器对jsp的解析有使用限制,而且jsp的本质是Servlet,每个页面的加载都需要先进行编译,所以jsp的效率相对于html或Themeleaf都比较低。 但是如果你非要在Spring Boot中使用jsp
399 0
springboot aop方式打印请求参数与结果(支持POST请求)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/81806044 @A...
8311 0
|
前端开发 Java
SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】下
SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】
SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】下
|
前端开发 Java 应用服务中间件
SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】上
SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】
SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】上
|
缓存 JSON Java
【SpringBoot基础系列】手把手实现国际化支持实例开发
国际化的支持,对于app开发的小伙伴来说应该比价常见了;作为java后端的小伙伴,一般来讲接触国际化的机会不太多,毕竟业务开展到海外的企业并没有太多 SpringBoot提供了国际化的支持,网上也有相关的教程,然而实际体验的时候,发现并没有预期的那么顺利;本文将介绍一下SpringBoot如何支持国家化,以及在支持的过程中,一些注意事项
512 0
【SpringBoot基础系列】手把手实现国际化支持实例开发
|
Java 开发者
SpringBoot 应用篇 实现后端的接口版本支持
作为一个主职的后端开发者,在平时的工作中,最讨厌的做的事情可以说是参数校验和接口的版本支持了。对于客户端的同学来说,业务的历史包袱会小很多,当出现不兼容的业务变动时,直接开发新的就好;然而后端就没有这么简单了,历史的接口得支持,新的业务也得支持,吭哧吭哧的新加一个服务接口,url 又不能和之前的相同,怎么办?只能在某个地方加一个类似v1, v2... 那么有没有一种不改变 url,通过其他的方式来支持版本管理的方式呢?
416 0
SpringBoot 应用篇 实现后端的接口版本支持
|
Java Shell 应用服务中间件