Mybatis-plus多数据源处理
1 背景
通常一个系统只需要连接一个数据库就可以了。但是在企业应用的开发中往往会和其他子系统交互,特别是对于一些数据实时性要求比较高的数据,我们就需要做实时连接查询,而不是做同步。这个时候就需要用到多数据源。
举个简单的例子某企业要做订单网上订单系统这里面就可以涉及到多个子系统的连接,比如:产品主数据的数据源,项目管理系统的数据源(项目可以产品订单)等多个不同数据库类似的数据源,他们可能是ORACLE,SQL SERVER,MYSQL等多种混合数据源。
2 多数据源概述
基于以上的背景,就会选择使用多个数据源,一个数据源用于读 一个数据源用于写。或者不同的数据源混合使用。他的基本思想其实就是AOP。我们可以通过AOP的思想实现 动态数据源切换,通过这个AOP思想可适用于多种场景、纯粹多库、读写分离、一主多从、混合模式等。
动态数据源能进行自动切换的核心就是spring底层的AbstractRoutingDataSource进行数据源的路由,只要继承了这个类均可看作是一个数据源的实现。主要实现方法是 determineCurrentLookupkey(),该方法只需要返回数据源实例名称
3 mybatisplus多数据源
我们在项目中用mybatisplus的使用用得比较多,这个动态数据源切换需要实现的话,比较麻烦,如果有现成的框架使用则最好不过了。恰好mybatiplus就能实现。文档地址如下:
https://baomidou.com/pages/a61e1b/#%E6%96%87%E6%A1%A3-documentation
https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
4 使用
4.1 介绍
dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。
特性:
- 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。
- 支持数据库敏感配置信息 加密 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的分布式事务方案。
- 提供 本地多数据源事务方案。
4.2 约定
- 本框架只做 切换数据源 这件核心的事情,并不限制你的具体操作,切换了数据源可以做任何CRUD。
- 配置文件所有以下划线
_
分割的数据源 首部 即为组的名称,相同组名称的数据源会放在一个组下。 - 切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。
- 默认的数据源名称为 master ,你可以通过
spring.datasource.dynamic.primary
修改。 - 方法上的注解优先于类上注解。
- DS支持继承抽象类上的DS,暂不支持继承接口上的DS。
4.3 使用
4.3.1 准备数据库
docker run --name mysq -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7
创建2个数据库
create database test1;
create database test2;
use test2;
-- auto-generated definition
create table tb_user
(
id int auto_increment
primary key,
name varchar(200) null
);
insert into tb_user values(1,"wangwu");
use test1;
-- auto-generated definition
create table tb_user
(
id int auto_increment
primary key,
name varchar(200) null
);
insert into tb_user values(1,"zhangsan");
一个作为主库 一个作为从库。
4.3.2 springboot创建工程
添加依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>dynamic</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>