SpringBoot实战(十)集成多数据源dynamic-datasource

news2025/1/13 3:32:38

目录

    • 1.Maven依赖
    • 2. @DS注解
    • 3.普通Hihari连接池
      • 3.1 yml配置
    • 4.Druid连接池
      • 4.1 Druid依赖
      • 4.2 yml配置
      • 4.3 排除原生的Druid配置
    • 5. UserController
    • 6. UserServiceImpl
    • 7.测试
      • 7.1 新增数据
      • 7.2 查询数据
      • 7.3 测试结果
    • 8.源码地址:

dynamic-datasource-spring-boot-starter 是一个基于 springboot 的快速集成多数据源的启动器。

  • 其支持 Jdk 1.7+SpringBoot 1.5.x2.x.x

1.Maven依赖

<!-- Dynamic datasource -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>2.4.2</version>
</dependency>

2. @DS注解

@DS 可以注解在方法上和类上,同时存在方法注解优先于类上注解。建议注解在serviceImpl类或mapper接口方法上。

注意:从2.0.0 不再支持@DS空注解 ,您 必须 指明你所需要的数据库 组名 或者 具体某个数据库名称 。

注解结果
没有@DS注解默认数据源
@DS(“dsName”)数据源名称

3.普通Hihari连接池

SpringBoot 2.x默认是使用HikariCP的, 所以觉得HikariCP可以的不需要换Druid。

3.1 yml配置

server:
  port: 8081

spring:
  datasource:
    dynamic:
      primary: auth
      datasource:
        auth:
          url: jdbc:mysql://localhost:3306/auth?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        mydb1:
          url: jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: "classpath:mapper/*.xml"

#showSql
logging:
  level:
    com:
      demo:
        auth:
          mapper : debug

4.Druid连接池

4.1 Druid依赖

<!-- Druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.22</version>
</dependency>

4.2 yml配置

server:
  port: 8081

spring:
  datasource:
    dynamic:
      primary: auth
      datasource:
        auth:
          # JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
          type: com.alibaba.druid.pool.DruidDataSource
          url: jdbc:mysql://localhost:3306/auth?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
          druid:
            #连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
            initial-size: 1
            max-active: 20
            min-idle: 1
            # 配置获取连接等待超时的时间
            max-wait: 60000
            #打开PSCache,并且指定每个连接上PSCache的大小
            pool-prepared-statements: true
            max-pool-prepared-statement-per-connection-size: 20
            validation-query: SELECT 'x'
            test-on-borrow: false
            test-on-return: false
            test-while-idle: true
            #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            time-between-eviction-runs-millis: 60000
            #配置一个连接在池中最小生存的时间,单位是毫秒
            min-evictable-idle-time-millis: 300000
            filters: stat,wall
            # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
            #是否启用StatFilter默认值true
            web-stat-filter.enabled: true
            web-stat-filter.url-pattern: /*
            web-stat-filter.exclusions: "*.js , *.gif ,*.jpg ,*.png ,*.css ,*.ico , /druid/*"
            web-stat-filter.session-stat-max-count: 1000
            web-stat-filter.profile-enable: true
            # StatViewServlet配置
            #展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
            #是否启用StatViewServlet默认值true
            stat-view-servlet.enabled: true
            #根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:
            #http://127.0.0.1:9000/druid/index.html
            #http://127.0.0.1:8080/mini-web/druid/index.html
            stat-view-servlet.url-pattern: /druid/*
            #允许清空统计数据
            stat-view-servlet.reset-enable: true
        mydb1:
          # JDBC 配置(驱动类自动从url的mysql识别,数据源类型自动识别)
          type: com.alibaba.druid.pool.DruidDataSource
          url: jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
          druid:
            #连接池配置(通常来说,只需要修改initialSize、minIdle、maxActive
            initial-size: 1
            max-active: 20
            min-idle: 1
            # 配置获取连接等待超时的时间
            max-wait: 60000
            #打开PSCache,并且指定每个连接上PSCache的大小
            pool-prepared-statements: true
            max-pool-prepared-statement-per-connection-size: 20
            validation-query: SELECT 'x'
            test-on-borrow: false
            test-on-return: false
            test-while-idle: true
            #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
            time-between-eviction-runs-millis: 60000
            #配置一个连接在池中最小生存的时间,单位是毫秒
            min-evictable-idle-time-millis: 300000
            filters: stat,wall
            # WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
            #是否启用StatFilter默认值true
            web-stat-filter.enabled: true
            web-stat-filter.url-pattern: /*
            web-stat-filter.exclusions: "*.js , *.gif ,*.jpg ,*.png ,*.css ,*.ico , /druid/*"
            web-stat-filter.session-stat-max-count: 1000
            web-stat-filter.profile-enable: true
            # StatViewServlet配置
            #展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
            #是否启用StatViewServlet默认值true
            stat-view-servlet.enabled: true
            #根据配置中的url-pattern来访问内置监控页面,如果是上面的配置,内置监控页面的首页是/druid/index.html例如:
            #http://127.0.0.1:9000/druid/index.html
            #http://127.0.0.1:8080/mini-web/druid/index.html
            stat-view-servlet.url-pattern: /druid/*
            #允许清空统计数据
            stat-view-servlet.reset-enable: true

mybatis:
  mapper-locations: "classpath:mapper/*.xml"

#showSql
logging:
  level:
    com:
      demo:
        auth:
          mapper : debug

4.3 排除原生的Druid配置

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class SpringbootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDemoApplication.class, args);
    }

}

5. UserController

import com.demo.auth.entity.User;
import com.demo.auth.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 用户表(User)表控制层
 *
 * @author ACGkaka
 * @since 2021-06-18 16:49:55
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 插入单条数据
     *
     * @return 单条数据
     */
    @GetMapping("/insertOne")
    public User insertOne() {
        User user = new User();
        user.setUsername("ACGkaka1");
        user.setPassword("123456");
        user.setEmail("123@123.com");
        user.setPhone("15588888888");
        user.setDelFlag("0");
        return userService.insert(user);
    }

    /**
     * 插入单条数据
     *
     * @return 单条数据
     */
    @GetMapping("/insertOne2")
    public User insertOne2() {
        User user = new User();
        user.setUsername("ACGkaka2");
        user.setPassword("123456");
        user.setEmail("123@123.com");
        user.setPhone("15588888888");
        user.setDelFlag("0");
        return userService.insert2(user);
    }

    /**
     * 查询全部数据
     *
     * @return 全部数据
     */
    @GetMapping("/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }

    /**
     * 查询全部数据
     *
     * @return 全部数据
     */
    @GetMapping("/findAll2")
    public List<User> findAll2() {
        return userService.findAll2();
    }

}

6. UserServiceImpl

import com.baomidou.dynamic.datasource.annotation.DS;
import com.demo.auth.entity.User;
import com.demo.auth.mapper.UserMapper;
import com.demo.auth.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 用户表(User)表服务实现类
 *
 * @author ACGkaka
 * @since 2021-06-18 16:49:55
 */
@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        // 查询多条数据
        return this.userMapper.queryAllByLimit(1, -1);
    }

    @DS("mydb1")
    @Override
    public List<User> findAll2() {
        // 查询多条数据
        return this.userMapper.queryAllByLimit(1, -1);
    }

    @Override
    public User insert(User user) {
        // 新增数据
        this.userMapper.insert(user);
        return user;
    }

    @DS("mydb1")
    @Override
    public User insert2(User user) {
        // 新增数据
        this.userMapper.insert(user);
        return user;
    }
}

7.测试

7.1 新增数据

在auth数据库新增一条数据:http://localhost:8081/user/insertOne

在mydb1数据库新增一条数据:http://localhost:8081/user/insertOne2

7.2 查询数据

在auth数据库查询数据:http://localhost:8081/user/findAll

在mydb1数据库查询数据:http://localhost:8081/user/findAll2

7.3 测试结果

  • /user/findAll 接口查询的是auth数据库中存储的“ACGkaka1”;
  • /user/findAll2 接口查询的是mydb数据库中存储的“ACGkaka2”;
  • 多数据源配置成功。

8.源码地址:

https://gitee.com/acgkaka/SpringBootExamples/tree/master/springboot-dynamic-datasource

整理完毕,完结撒花~





参考地址:

1.springBoot(六) 调用多数据源 dynamic-datasource,https://blog.csdn.net/Tang_5253/article/details/101095855
2.dynamic-datasource SpringBoot 多数据源快速启动器,https://www.oschina.net/p/dynamic-datasource-spring-boot-starter?hmsr=aladdin1e1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大数据入门核心技术-Kafka】(四)Kafka常用shell命令

目录 一、准备工作 1、Zookeeper集群安装 2、Kafka集群安装 二、常用Shell命令 1、创建Topic 2、查看创建的Topic 3、查看某一个Topic的详细信息 4、修改Topic 5、删除Topic 6、生产者发布消息命令 7、消费者接受消息命令 8、查看kafka节点数目 9、查看kafka进程 一…

再学C语言8:数据类型(6)——float和其他类型

一、_Bool类型 _Bool类型由C99引入 _Bool类型用于表示布尔值&#xff1a;逻辑值true&#xff08;真&#xff09;和false&#xff08;假&#xff09; C用值1表示true&#xff0c;用值0表示false&#xff0c;所以_Bool类型本质上也是一种整数类型 二、float、double和long do…

查找排序编程题——二分查找+冒泡排序‍♀️

目录 7-1 二分查找 输入格式: 输出格式: 输入样例: AC&#xff1a; 7-2 冒泡法排序 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; AC&#xff1a; 附&#xff1a; 分享&#x1f31e; &#xff1a; 前途与玫瑰 来日与方…

尝试使用LTTng+TraceCompass分析一下进程周期偏移

准备工作 我先是在板子里通过LTTng Stream的方式将log保存在了上位机里。 然后在上位机中打开TraceCompass分析log。 导出整理log数据 然后我在events表格中搜索我的进程名&#xff0c;发现主要是sched_switch sched_waking sched_wakeup这三类。 然后我又搜索了一下&#x…

10个最好的WordPress RSS插件比较(2022)

您是否正在为您的网站寻找最好的 WordPress RSS 提要插件&#xff1f; RSS 提要插件可以轻松地自动从其他网站提取内容并将其显示在您的网站上。它们还可用于提高参与度、增加流量和增加页面浏览量。 在本文中&#xff0c;我们将分享我们挑选的可在您的网站上使用的最佳 Word…

远眺捷码智慧乡村方案赋能乡村治理,打造更智慧更宜居的乡村

01.智慧乡村治理重要性 “智慧乡村”是以云计算、大数据应用、地理信息系统网络、物联网技术为核心&#xff0c;通过构建服务于政务管理、农业增收、民生幸福等方面的系统应用平台&#xff0c;将社会基础信息、产业发展、环境监测、医疗卫生、劳动保障、社会管理、公共服务等要…

全面便捷的数据管理能力,助力数据运营降本增效

对于任何企业来说&#xff0c;销售和供应链总是天平秤座的两端。如何放置两个砝码是对企业管理能力的极大考验。今天&#xff0c;让我们来谈谈供应链管理的例子来探讨一下对于报表工具而言&#xff0c;怎么样才能让客户全面、便捷的全局管理数据接入。背景&#xff1a;有序的供…

SPRING-了解4-AOP1

主要理念&#xff1a;不用继承&#xff0c;而是用Java Reflect类中的Proxy来实现对方法的增强 面向切面编程 oop的延续&#xff0c;对业务进行隔离&#xff0c;降低耦合度&#xff0c;目标是不改变原来的代码在主干中增加新功能 比如已经写好登录功能&#xff0c;现在需要加…

【大数据技术】流数据、流计算、Spark Streaming、DStream的讲解(图文解释 超详细)

流数据和流计算 在大数据时代&#xff0c;数据可以分为静态数据和流数据&#xff0c;静态数据是指在很长一段时间内不会变化&#xff0c;一般不随运行而变化的数据。流数据是一组顺序、大量、快速、连续到达的数据序列&#xff0c;一般情况下数据流可被视为一个随时间延续而无…

脑白质WM中的血流动力学响应函数HRF的特性

血流动力学响应函数HRF 估计BOLD信号的血流动力学响应函数(HRF)对于解释和分析与事件相关的fMRI数据至关重要广义线性模型(GLM)假设BOLD信号是真实反应与HRF进行卷积而得到的 一般来说&#xff0c;白质中功能激活的检测灵敏度远低于灰质&#xff0c;并且激活区域一般较小 原因…

[附源码]Nodejs计算机毕业设计健身房管理系统设计Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

J-003 Jetson电路设计之USB设计--NANO XAVIER NX

USB设计1 简介2 框图介绍3 USB HUB设计3.1电源部分3.2 芯片引脚3.3 晶振电路4 电源控制4.4 电源开关电路设计4 调试USB电路设计1 简介 NANO & XAVIER NX提供三路USB接口&#xff0c;其中包含一路调试USB&#xff08;用于镜像下载&#xff09;和一路USB3.2接口。引脚说明: …

编码踩坑——MySQL更新存放JSON的字段、\“ 转义成 “

本篇介绍在执行MySQL线上变更时遇到的问题&#xff0c;表现为"更新JSON字段时&#xff0c;实际更新的值与SQL语句中的值不一致&#xff0c;JSON格式错误"&#xff0c;如下&#xff1b; 问题描述 处理线上问题&#xff0c;需要新插入一条记录&#xff1b;将原JSON粘贴…

Jenkins(2)— 配置webhooks触发器

1、项目配置 项目配置 >> 构建触发器 >> 选择Gitee webhook触发器 生成Gitee WebHook密码&#xff1a;46d678257c0399b105635bcb9722ea09 2、Gitee配置 Gitee项目 >> 管理 >> 配置WebHooks 注意&#xff1a; 由于我的jenkins是部署在本地的&#xff…

element-ui+js+vue——实现图片的放大缩小拖动等功能——技能提升

elementuijsvue——实现图片组件的封装 1. 实现图片的放大缩小 2. 实现图片的拖动功能 3. 实现图片的预览最近同事在写一个关于 图片放大缩小拖动的功能&#xff0c;其实不止是图片&#xff0c;只要是在以下组件中的内容&#xff0c;都是可以支持放大缩小拖动的。 功能&#x…

Web前端项目的跨平台桌面客户端打包方案之——CEF框架

文章目录1、什么是CEF2、测测你电脑里的CEF3、从0开始的CEF入门实例1、什么是CEF CEF是什么 概念 Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件。 CEF的目标是为第三方应用提供可嵌入浏览器支持。CEF隔离底层Chromium和Blink的复杂代码…

靠着数套的Java刷题PDF,成功“混进”腾讯T3

昨晚半夜&#xff0c;一个学Java的老弟突然打电话告诉我他拿到了腾讯T3的offer&#xff0c;说实话&#xff0c;我有点诧异。。。 这老弟也是渣硕一枚&#xff0c;去投岗了腾讯的Java后台开发岗位。等了一个星期后简历被放回池子里了&#xff0c;眼看着提前批马上就要截止了&am…

jsp+ssm计算机毕业设计多媒体课程精品课程网站【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

海量数据小内存!从未出现过的数在哪里

文章目录题目要求1&#xff09;内存 1G2&#xff09;内存 3 KB3&#xff09;内存 有限变量举例题目 现在有 40 亿个无符号整数&#xff0c;无符号整数的范围是 0 ~ 232-1&#xff08;42亿&#xff09;&#xff0c;哪怕 40 亿个数完全不同&#xff0c;在该范围中也总有没有出现…

傻白探索Chiplet,关于EPYC Zen2 的一些理解记录(五)

目录 一、知识铺垫 &#xff08;1&#xff09;Chiplet &#xff08;2&#xff09;Zen架构 &#xff08;3&#xff09;EPYC和Ryzen &#xff08;4&#xff09;EPYC Zen2 二、关于EPYC Zen2里的部件 &#xff08;1&#xff09;内存控制器 &#xff08;2&#xff…