SpringBoot多数据源(一)

news2024/11/17 7:23:18

SpringBoot多数据源(一)

  • 1.多数据源使用场景
    • 1.1 业务复杂(数据量大)
    • 1.2 读写分离
  • 2.多数据源配置
  • 3.应用
  • 4.测试

1.多数据源使用场景

1.1 业务复杂(数据量大)

简单理解就是业务量复杂,将庞大的数据拆到多个数据库中。或者由于公司有多个子项目,各用各的数据库,涉及数据共享

1.2 读写分离

为了解决数据库的读性能瓶颈(读比写性能更高,写锁会影响读阻塞,从而影响读的性能)

与上述1.1不同的是,在读写分离中,主库和从库的数据库是一致的(不考虑主从延迟)。数据更新操作(insertupdatedelete)都是在主库上进行的,主库将数据更新信息同步给
从库。在查询时,可以在从库上进行。从而分担主库的压力。

2.多数据源配置

spring:
  datasource:
    #数据源1
    datasource1:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test_master
      username: root
      password: root
      druid:
         initial-size: 1
         min-idle: 1
         max-active: 20
         test-on-borrow: true

    #数据源2
    datasource2:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test_slave
      username: root
      password: root
      druid:
        initial-size: 1
        min-idle: 1
        max-active: 20
        test-on-borrow: true

# mybatis的配置
mybatis:
  type-aliases-package: com.rql.entity
  mapper-locations: classpath:mybatis/*.xml

这里在配置时,特别注意在使用多配置源时,要将url改为jdbc-url

对应两个数据库:

在这里插入图片描述

3.应用

下面是一个简单的SpringBoot整合mybatis的项目目录层级:

在这里插入图片描述

其中DataSourceConfig用于定义DataSource Bean,并通过@ConfigurationProperties注解将配置文件中的属性映射到该Bean的属性上
DataSourceConfig.java

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.datasource1")
    public DataSource dataSource1(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.datasource2")
    public DataSource dataSource2(){
        return DataSourceBuilder.create().build();
    }
}

上面只是创建了两个DataSourceBean,分别为dataSource1dataSource2,如果想要动态地根据操作去调用不同的数据源,那么就需要再创建一个Bean,类似于代理的角色,根据条件来选择不同的数据源。

因此,创建DynamicDataSource.java,并实现了DataSource接口。



@Component
@Primary
public class DynamicDataSource implements DataSource, InitializingBean {

    public static ThreadLocal<String> name=new ThreadLocal<>();

    @Autowired
    DataSource dataSource1;

    @Autowired
    DataSource dataSource2;

    @Override
    public Connection getConnection() throws SQLException {
        if (name.get().equals("w")) {
            return dataSource1.getConnection();
        }
        else {
            return dataSource2.getConnection();
        }
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return null;
    }

    @Override
    public PrintWriter getLogWriter() throws SQLException {
        return null;
    }

    @Override
    public void setLogWriter(PrintWriter out) throws SQLException {

    }

    @Override
    public void setLoginTimeout(int seconds) throws SQLException {

    }

    @Override
    public int getLoginTimeout() throws SQLException {
        return 0;
    }

    @Override
    public Logger getParentLogger() throws SQLFeatureNotSupportedException {
        return null;
    }

    @Override
    public <T> T unwrap(Class<T> iface) throws SQLException {
        return null;
    }

    @Override
    public boolean isWrapperFor(Class<?> iface) throws SQLException {
        return false;
    }

    @Override
    public void afterPropertiesSet() throws Exception {

        name.set("w");
    }
}

这里主要通过getConnection()方法来选择需要连接的数据源,因此根据读写操作的不同,设置一个值来区别(一般是使用枚举值,这样后面修改时不至于到代码中挨个去找),文中主要设置了一个参数,为了讲述方面。

public static ThreadLocal<String> name=new ThreadLocal<>();

注意到DynamicDataSource.java也实现了InitializingBean 接口。

InitializingBean接口是Spring Framework中的一个重要接口,其主要目的是在Bean实例化后进行初始化操作。具体来说,当一个Bean实现了InitializingBean接口并被Spring容器创建后,Spring会在该Bean的属性设置完成后自动调用afterPropertiesSet()方法来执行一些额外的初始化逻辑。

因此,这里在Bean实例化后,设置了name的初始值。

4.测试

@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserDao userDao;

    @GetMapping("/a")
    public List<User> selectUsers(){
        DynamicDataSource.name.set("r");
        return userDao.findAll();
    }

    @PostMapping("/b")
    public void insertUser(@RequestBody User user){
        DynamicDataSource.name.set("w");
        userDao.inserUser(user);
    }

}

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

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

相关文章

基于Springboot的校园新闻网站

基于SpringbootVue的校园新闻网站的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 校园新闻 论坛交流 留言反馈 后台登录 用户管理 新闻类型管理 校园新闻…

150G全国1米分辨率土地利用数据【2023年】

#1数据摘要 全国1米分辨率土地利用数据 全国范围,分省份分类,1米精度土地利用数据。2023年版本。 数据格式:tif 坐标系:wgs1984 范围:全国各省份 时间:2023年 精度:1米 地类:共计11个地类 中国1m分辨率土地覆盖数据 文件命名与介绍:数据为GeoTIFF栅格格式,每个城市…

Java:内部类

目录 1.内部类介绍2.实例内部类3.静态内部类4.局部内部类5.匿名内部类 1.内部类介绍 当一个事物的内部&#xff0c;还有一个部分需要一个完整的结构进行描述&#xff0c;而这个内部的完整的结构又只为外部事物提供服务&#xff0c;那么这个内部的完整结构最好使用内部类。在 J…

处理游戏提示找不到steam_api64.dll丢失的方法

steam_api64.dll 是一个专门为 64 位 Windows 操作系统设计的动态链接库&#xff08;Dynamic Link Library&#xff0c;简称 DLL&#xff09;文件&#xff0c;与 steam_api.dll 类似&#xff0c;但针对的是 64 位应用程序。它属于 Steam 平台的一部分&#xff0c;主要服务于通过…

【Redis】面试题汇总

Redis什么是Redis、使用场景有哪些Redis 为什么这么快&#xff1f;Redis 数据类型及使用场景五种常见的 Redis 数据类型是怎么实现&#xff1f;Redis是单线程吗Redis 采用单线程为什么还这么快&#xff1f;Redis 如何实现数据不丢失&#xff1f;Redis 如何实现服务高可用&#…

为什么中级职称评审不通过?有什么原因?

参与过职称评审或者有了解过职称评审的小伙伴们&#xff0c;应该都知道&#xff0c;职称评审都是有通过率&#xff0c;不是你去评&#xff0c;一定会评下来&#xff0c;一定会发证的&#xff0c;那么评审为什么不通过&#xff1f;有哪些原因呢&#xff1f; 现在职称评审人越来越…

vue框架中的组件通信

vue框架中的组件通信 一.组件通信关系二.父子通信1.props 校验2.prop & data、单向数据流 二.非父子通信-event bus 事件总线三.非父子通信 (拓展) - provide & inject四.v-model简化父子通信代码五. .sync修饰符 一.组件通信关系 组件关系分类&#xff1a; 1.父子关系…

细水雾发生器你的相信我的诚信

做销售就是两个信&#xff1a;你的相信&#xff01;我的诚信&#xff01;成交就两颗心&#xff1a;你的放心&#xff01;我的用心&#xff01;你给我一次合作的机会&#xff0c;我给你十分满意的产品。一次合作&#xff0c;终身朋友&#xff5e; 产品的结构&#xff1a; 细水雾…

快速了解什么是MES系统

近年来在制造业的推动下&#xff0c;大家是否会经常听到MES系统这一词&#xff0c;但是对于其具体能解决什么问题却不是很清晰。接下来&#xff0c;让大家快速地了解一下到底什么是MES系统以及MES系统能够解决什么问题。 什么是MES制造执行系统 制造执行系统&#xff08;Manufa…

TBWeb开发版V3.2.6免授权无后门Chatgpt系统源码下载及详细安装教程

TBWeb系统是基于 NineAI 二开的可商业化 TB Web 应用&#xff08;免授权&#xff0c;无后门&#xff0c;非盗版&#xff0c;已整合前后端&#xff0c;支持快速部署&#xff09;。相比稳定版&#xff0c;开发版进度更快一些。前端改进&#xff1a;对话页UI重构&#xff0c;参考C…

Excel超级处理器,批量创建工作表,这也太方便了吧

在工作中&#xff0c;经常要创建或复制多个工作表&#xff0c;按照日期或指定的工作表名&#xff0c;为了能够更加方便快捷&#xff0c;那么下面介绍使用超级处理的应用。 超级处理器下载与安装 1、按照本月日期创建新工作表 2、按照本月日期复制工作表 3、按照单元格内容创建…

外显子测序wes

外显子是基因组中能够转录组出成熟RNA的部分。一个基因组中所有外显子的集合&#xff0c;即为外显子组。值得注意的是&#xff0c;通常所说的全外显子组测序&#xff0c;是指针对蛋白编码基因的外显子&#xff0c;很少涉及非编码基因。 基因(gene)是DNA中含有特定遗传信息的一…

AI智能电销机器人的营销策略是什么?

近年来&#xff0c;伴随着制造业新一轮的数字化智能化转型浪潮。各大企业开始使用电销机器人&#xff0c;解决了传统电销工作过程中的许多问题&#xff0c;更显著的是&#xff1a;电话机器人在替代人工工作基础上&#xff0c;节约人工成本70%以上&#xff0c;极大程度地高额完成…

从本地创建项目到 Gitee 提交的完整教程

1、本地创建一个新项目 2.进入想上传的项目的文件夹&#xff0c;然后右键点击git bash 3.初始化本地环境&#xff0c;把该项目变成可被git管理的仓库 4.添加该项目下的所有文件到暂存区 5.使用如下命令将文件添加到仓库中去 6.在gitee上创建以自己项目名称命名的空项目 7.将本地…

Windows上使用VSCode连接远程服务器(附图文过程)

1、下载VSCode 官网下载地址&#xff0c;选择需要的进行下载 2、安装SSH插件 安装完成之后&#xff0c;启动vscode&#xff0c;选择左侧Extensions 选项卡&#xff0c;在输入框搜索 remote &#xff0c;选择安装Remote-SSH插件&#xff08;我使用了汉化&#xff0c;如果要用…

ubuntu18.04与windows文件互传

目录 window下载Xftp软件ubuntu上的配置windows端Xftp软件的使用 window下载Xftp软件 下载&#xff1a;家庭/学校免费版 安装教程推荐下面的文章 xftp7免费版安装教程&#xff08;详细&#xff09; ubuntu上的配置 在进入系统后&#xff0c;确保有网络连接的情况下按Ctrl A…

制作适用于openstack平台的win10镜像

1. 安装准备 从MSDN下载windows 10的镜像虚拟机开启CPU虚拟化的功能。从Fedora 网站下载已签名的 VirtIO 驱动程序 ISO 。 创建15 GB 的 qcow2 镜像&#xff1a;qemu-img create -f qcow2 win10.qcow2 15G 安装必要的软件 yum install qemu-kvm qemu-img virt-manager libvir…

28map,set关联式容器

序列式容器 vector、list、deque(单纯的纯数据) 关联式容器 map、set&#xff0c;哈希&#xff0c;&#xff0c;&#xff0c;(数据之间有很强的关联性,不是单纯的为了存储数据) Set 底层是搜索树&#xff08;红黑树&#xff09; T是key &#xff0c;compare是仿函数&#xff0…

书生·浦语大模型-第四节课笔记/作业

笔记 作业 xtuner train ./config/internlm2_chat_7b_qlora_alpaca_e3_copy.py --work-dir ./train微调前效果 微调后效果 微调过程-transformer-lora

Django中的定时任务与后台任务队列的实践

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在Web开发中&#xff0c;处理定时任务和后台任务队列是很常见的需求。Django作为一个功能强…