spring boot动态切换数据源的实现

作者:归来_仍是少年 时间:2022-04-20 14:17:03 

当数据量比较大的时候,我们就需要考虑读写分离了,也就是动态切换数据库连接,对指定的数据库进行操作。在spring中实现动态的切换无非就是利用AOP实现。我们可以使用mybatis-plus作者开发的插件dynamic-datasource-spring-boot-starter。

demo地址:https://github.com/songshijun1995/spring-boot-dynamic-demo

新建项目引入依赖


<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
 <version>3.3.1</version>
</dependency>
<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.4.1</version>
</dependency>

配置yml


server:
port: 8081
servlet:
 context-path: /

spring:
application:
 name: spring-boot-dynamic-demo
datasource:
 dynamic:
  primary: master #设置默认的数据源或者数据源组,默认值即为master
  strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
  datasource:
   master: #替换成自己的数据库连接
    url: jdbc:mysql://127.0.0.1:3306/dynamic1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowMultiQueries=true&rewriteBatchedStatements=true
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
   slave_1:
    url: jdbc:mysql://127.0.0.1:3306/dynamic2?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowMultiQueries=true&rewriteBatchedStatements=true
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
configuration:
 log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
global-config:
 db-config:
  logic-delete-value: 1
  logic-not-delete-value: 0
  logic-delete-field: deleted
mapper-locations: classpath:/mapper/**.xml

logging:
level:
 ROOT: INFO
 com.dynamic.dynamicdemo: DEBUG
pattern:
 file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n'
file:
 name: ${logging.file.path}/${spring.application.name}.log
 path: /home/logs/${spring.application.name}
logback:
 rollingpolicy:
  max-file-size: 10MB
  max-history: 30

mybatis-plus和swagger配置我就不多说了,demo里都有

如何使用


package com.dynamic.dynamicdemo.service.impl;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dynamic.dynamicdemo.dto.PageRequest;
import com.dynamic.dynamicdemo.dto.UserInfoRequest;
import com.dynamic.dynamicdemo.entities.BaseEntity;
import com.dynamic.dynamicdemo.entities.UserInfo;
import com.dynamic.dynamicdemo.mapper.UserInfoMapper;
import com.dynamic.dynamicdemo.service.UserInfoService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {

@DS("master")
 @Transactional(rollbackFor = Exception.class)
 @Override
 public String saveUser(UserInfoRequest request) {
   UserInfo userInfo = new UserInfo();
   BeanUtils.copyProperties(request, userInfo);
   boolean save = save(userInfo);
   if (!save) {
     throw new RuntimeException("添加用户失败");
   }
   return "添加用户成功";
 }

@DS("slave_1")
 @Override
 public IPage<UserInfo> pageUser(PageRequest request) {
   return page(new Page<>(request.getPageNum(), request.getPageSize()), Wrappers.<UserInfo>lambdaQuery().orderByDesc(BaseEntity::getCreateTime));
 }
}

在方法上或者类上加@DS("master")注解,来指定数据源

更换为自己的数据库连接,以及建库,运行resources/sql目录下的sql文件
然后启动项目访问http://127.0.0.1:8081/doc.html进行测试

来源:https://www.jianshu.com/p/692d49d93ce4

标签:springboot,数据源
0
投稿

猜你喜欢

  • C#中的EventHandler观察者模式详解

    2021-09-04 17:08:27
  • Android编程实现加载等待ProgressDialog的方法

    2022-09-11 21:12:11
  • win7中C#的winForm编程使用savefiledialog不能弹出保存窗体的解决方法

    2022-09-18 07:27:57
  • Unity排行榜优化滚动效果

    2021-09-08 13:02:07
  • SpringBoot整合Web开发之Json数据返回的实现

    2023-04-27 05:06:51
  • HashMap的get()方法的NullPointerException问题

    2023-09-23 07:24:12
  • 使用Prometheus+Grafana的方法监控Springboot应用教程详解

    2023-10-31 13:08:12
  • C#实现Array添加扩展实例

    2023-02-16 23:01:03
  • C#中if语句使用概述

    2022-08-31 23:22:09
  • 详解Java类库的概念以及import的使用方法

    2022-04-18 06:56:54
  • intellij idea使用git stash暂存一次提交的操作

    2023-03-08 08:30:11
  • Java 中 hashCode() 与 equals() 的关系(面试)

    2023-08-29 18:03:57
  • SpringBoot2 Jpa 批量删除功能的实现

    2023-06-18 04:54:35
  • 详解Java实践之建造者模式

    2023-01-14 23:03:13
  • 浅谈Java中方法参数传递的问题

    2021-11-06 04:24:46
  • C#学习笔记整理_浅谈Math类的方法

    2022-04-11 06:16:48
  • Java二维数组简单定义与使用方法示例

    2022-01-28 08:31:37
  • java调用微信现金红包接口的心得与体会总结

    2022-12-22 19:55:12
  • Java数据结构学习之二叉树

    2023-04-25 12:08:27
  • mybatis-plus @DS实现动态切换数据源原理

    2023-07-09 21:44:23
  • asp之家 软件编程 m.aspxhome.com