mybatisplus快速实现动态数据源切换

1.背景
 

  通常一个系统只需要连接一个数据库就可以了。但是在企业应用的开发中往往会和其他子系统交互,特别是对于一些数据实时性要求比较高的数据,我们就需要做实时连接查询,而不是做同步。这个时候就需要用到多数据源。
 

  举个简单的例子某企业要做订单网上订单系统这里面就可以涉及到多个子系统的连接,比如:产品主数据的数据源,项目管理系统的数据源(项目可以产品订单)等多个不同数据库类似的数据源,他们可能是ORACLE,SQL SERVER,MYSQL等多种混合数据源。
 

  2.多数据源概述
 

  基于以上的背景,就会选择使用多个数据源,一个数据源用于读一个数据源用于写。或者不同的数据源混合使用。他的基本思想其实就是AOP。我们可以通过AOP的思想实现动态数据源切换,通过这个AOP思想可适用于多种场景、纯粹多库、读写分离、一主多从、混合模式等。

  动态数据源能进行自动切换的核心就是spring底层的AbstractRoutingDataSource进行数据源的路由,只要继承了这个类均可看作是一个数据源的实现。主要实现方法是determineCurrentLookupkey,该方法只需要返回数据源实例名称。
 

  3.mybatisplus多数据源
 

  我们在项目中用mybatisplus的使用用得比较多,这个动态数据源切换需要实现的话,比较麻烦,如果有现成的框架使用则最好不过了。恰好mybatiplus就能实现。文档地址如下:
 

  ```properties

  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。

  -支持无数据源启动,支持懒加载数据源(需要的时候再创建连接)。

  -支持**自定义注解**,需继承DS3.2.0+。

  -提供并简化对Druid,HikariCp,BeeCp,Dbcp2的快速集成。

  -提供对Mybatis-Plus,Quartz,ShardingJdbc,P6sy,Jndi等组件的集成方案。

  -提供**自定义数据源来源**方案(如全从数据库加载)。

  -提供项目启动后**动态增加移除数据源**方案。

  -提供Mybatis环境下的**纯读写分离**方案。

  -提供使用**spel动态参数**解析数据源方案。内置spel,session,header,支持自定义。

  -支持**多层数据源嵌套切换**。(ServiceA>>>ServiceB>>>ServiceC)。

  -提供**基于seata的分布式事务方案。

  -提供**本地多数据源事务方案。**
 

  4.2 约定
 

  1.本框架只做**切换数据源**这件核心的事情,并**不限制你的具体操作**,切换了数据源可以做任何CRUD。

  2.配置文件所有以下划线`_`分割的数据源**首部**即为组的名称,相同组名称的数据源会放在一个组下。

  3.切换数据源可以是组名,也可以是具体数据源名称。组名则切换时采用负载均衡算法切换。

  4.默认的数据源名称为**master**,你可以通过`sprin

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus 是一个 Mybatis 的增强工具,在多数据源的方面,可以通过配置多个数据源实现多数据源切换。 1. 在配置文件中配置多个数据源的信息: ``` spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver spring.datasource.dynamic.datasource.master.username=root spring.datasource.dynamic.datasource.master.password=root spring.datasource.dynamic.datasource.slave.url=jdbc:mysql://localhost:3306/db_slave?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.dynamic.datasource.slave.driver-class-name=com.mysql.jdbc.Driver spring.datasource.dynamic.datasource.slave.username=root spring.datasource.dynamic.datasource.slave.password=root ``` 2. 配置多数据源的路由规则: ``` @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties("spring.datasource.dynamic.datasource.master") public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties("spring.datasource.dynamic.datasource.slave") public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean @Primary public DynamicDataSource dynamicDataSource(DataSource masterDataSource, DataSource slaveDataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceEnum.MASTER.getName(), masterDataSource); targetDataSources.put(DataSourceEnum.SLAVE.getName(), slaveDataSource); return new DynamicDataSource(masterDataSource, targetDataSources); } } ``` 3. 定义数据源路由类: ``` public class DynamicDataSource extends AbstractRoutingDataSource { private static final ThreadLocal<DataSourceEnum> CONTEXT_HOLDER = new ThreadLocal<>(); public DynamicDataSource(DataSource defaultDataSource, Map<Object, Object> targetDataSources) { super.setDefaultTargetDataSource(defaultDataSource); super.setTargetDataSources(targetDataSources); super.afterPropertiesSet(); } @Override protected Object determineCurrentLookupKey() { return CONTEXT_HOLDER.get(); } public static void setDataSource(DataSourceEnum dataSource) { CONTEXT_HOLDER.set(dataSource); } public static void clearDataSource() { CONTEXT_HOLDER.remove(); } } ``` 4. 定义数据源枚举: ``` public enum DataSourceEnum { MASTER("master"), SLAVE("slave"); private String name; DataSourceEnum(String name) { this.name = name; } public String getName() { return name; } } ``` 5. 在需要切换数据源的地方,通过调用 `DynamicDataSource.setDataSource()` 方法来设置需要使用的数据源。例如: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> list() { DynamicDataSource.setDataSource(DataSourceEnum.SLAVE); List<User> userList = userMapper.selectList(null); DynamicDataSource.clearDataSource(); return userList; } } ``` 以上就是使用 Mybatis-Plus 实现多数据源切换的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值