公司项目有连接多个不同数据库的需求,特研究了一下,根据网上的资料,造了一个基于AOP方式的数据源切换轮子,但继续探索,突然发现有开源的多数据源管理启动器。不过,本篇两种方式都会介绍。
基于dynamic-datasource实现多数据源 dynamic-datasource介绍dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。
其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x
dynamic-datasource特性 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库敏感配置信息 加密 ENC()。支持每个数据库独立初始化表结构schema和数据库database。支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。支持 自定义注解 ,需继承DS(3.2.0+)。提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。提供 自定义数据源来源 方案(如全从数据库加载)。提供项目启动后 动态增加移除数据源 方案。提供Mybatis环境下的 纯读写分离 方案。提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持自定义。支持 多层数据源嵌套切换 。(ServiceA >>> ServiceB >>> ServiceC)。提供 基于seata的分布式事务方案。提供 本地多数据源事务方案。 附:不能和原生spring事务混用。我们目前只探讨使用dynamic-datasource进行数据源切换,其他请自行搜索
dynamic-datasource的相关约定
dynamic-datasource只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。配置文件所有以下划线 _ 分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。默认的数据源名称为 master ,你可以通过 spring.datasource.dynamic.primary 修改。方法上的注解优先于类上注解。DS支持继承抽象类上的DS,暂不支持继承接口上的DS。引入dynamic-datasource依赖
配置数据源
使用 @DS 切换数据源@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。
注解结果不使用@DS注解默认数据源,即primary: mysql@DS(“dsName”)dsName可以为组名也可以为具体某个库的名称 @DS使用实例 基于AOP手动实现多数据源本次代码参考 https://github.com/mianshenglee/my-example/tree/master/multi-datasource/dynamic-datasource ,因源码不满足的需求,因此我在此基础做了修改。
项目工程结构
项目依赖
配置文件
自定义注解
编写DataSourceConstants
动态数据源名称上下文处理
获取当前动态数据源方法
动态数据源配置
AOP切面
编写TestUser实体
TestUserMapper
TestUserService
TestUserController
MapperXml
启动测试
不使用注解
效果
该代码优先级与使用框架效果一致,即不使用注解将默认使用MASTER数据库,方法上存在注解优先使用方法上标注的注解。
已知MASTER 6条数据, SLAVE4条数据
访问 http://127.0.0.1:8080/dd/user/listall 查看效果
类上使用注解
效果
方法上使用注解
效果
总结到此这篇关于SpringBoot多数据源的两种实现方式的文章就介绍到这了,更多相关SpringBoot多数据源实现内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!