SpringBoot多数据源(一)

SpringBoot多数据源(一)

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

1.多数据源使用场景

1.1 业务复杂(数据量大)

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

1.2 读写分离

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

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

2.多数据源配置

spring:datasource:#数据源1datasource1:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/test_masterusername: rootpassword: rootdruid:initial-size: 1min-idle: 1max-active: 20test-on-borrow: true#数据源2datasource2:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/test_slaveusername: rootpassword: rootdruid:initial-size: 1min-idle: 1max-active: 20test-on-borrow: true# mybatis的配置
mybatis:type-aliases-package: com.rql.entitymapper-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<>();@AutowiredDataSource dataSource1;@AutowiredDataSource dataSource2;@Overridepublic Connection getConnection() throws SQLException {if (name.get().equals("w")) {return dataSource1.getConnection();}else {return dataSource2.getConnection();}}@Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}@Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}@Overridepublic void setLogWriter(PrintWriter out) throws SQLException {}@Overridepublic void setLoginTimeout(int seconds) throws SQLException {}@Overridepublic int getLoginTimeout() throws SQLException {return 0;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}@Overridepublic <T> T unwrap(Class<T> iface) throws SQLException {return null;}@Overridepublic boolean isWrapperFor(Class<?> iface) throws SQLException {return false;}@Overridepublic 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 {@Autowiredprivate 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.mzph.cn/diannao/1277.shtml

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

相关文章

Python模块之logging

官方文档 常见用法 logging模块是Python标准库中用于记录日志的模块。它提供了灵活且可配置的日志记录功能&#xff0c;可以用于在应用程序中捕获和输出各种级别的日志消息。以下是logging模块的常见用法示例&#xff1a; python import logging# 配置日志记录器 logging.b…

Java中的==与equals的区别

区别 首先&#xff0c;是运算符&#xff0c;equals()是方法 是一个二元运算符&#xff0c;用于比较两个对象的引用是否相同。当使用 进行比较时&#xff0c;Java会检查两个对象的内存地址是否相同。如果两个对象的内存地址相同&#xff0c;则认为它们是相同的。 如果比较的…

浏览器原理之本地存储

一 浏览器本地存储方式及使用场景 Cookies: 小段数据&#xff0c;由服务器发送到用户浏览器&#xff0c;浏览器将其存储并在以后的请求中回送到服务器。使用场景&#xff1a;会话管理&#xff08;登录状态、用户偏好设置&#xff09;、个性化&#xff08;用户主题&#xff09;、…

本地消息表模式保障分布式系统最终一致性

系统架构说明 状态转换说明 订单表消息表process_queue库存系统return_queue说明成功失败///订单库回滚成功成功失败//订单系统重发消息成功成功成功失败/Broker自动重试&#xff0c;注意接口幂等成功成功成功库存不足退回/Broker通知回掉&#xff0c;订单/消息作废成功成功成…

车轮上的智能:探索机器学习在汽车行业的应用前景

文章目录 引言&#xff1a;一、机器学习在汽车设计中的应用设计优化模拟与测试 二、智能制造与生产三、自动驾驶技术感知与决策数据融合 四、市场与模式的变革五、机器学习对于汽车行业的机遇与挑战挑战机遇 引言&#xff1a; 在当今数字化时代&#xff0c;机器学习作为人工智…

速盾:cdn可以加速哪些服务器

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种通过将网站的静态资源部署到全球各地的服务器上&#xff0c;以提供更快速、更可靠的访问体验的技术。CDN可以加速许多类型的服务器&#xff0c;包括但不限于以下几种&#xff1a; 静态资源服…

全方位解析:深入了解Microsoft Edge浏览器的优势与特性

目录 1. 速度快&#xff1a; 2. 内存占用低&#xff1a; 3. 集成性好&#xff1a; 4. 支持Web标准&#xff1a; 5. 定制化选项&#xff1a; 6. 阅读模式和笔记功能&#xff1a; 7. 搜索引擎优化&#xff1a; 8. 扩展程序库&#xff1a; 9. 跨平台同步&#xff1a; 10…

android学习笔记(四)

1、ExampleInstrumentedTest的解读&#xff1a; /*** Instrumented test, which will execute on an Android device.** see <a href"http://d.android.com/tools/testing">Testing documentation</a>*/ RunWith(AndroidJUnit4.class) public class Exa…

Kafka -基本概念

认识Kafka kafka是一个多分区、多副本、基于zookeeper协调的分布式消息系统。 扮演角色 消息系统存储系统&#xff1a;把消息持久化到磁盘&#xff0c;相比于其他基于内存存储的系统而言&#xff0c;有效降低了数据丢失的风险。流式处理平台 基本概念 kafka的体系结构&…

Python爬虫-批量爬取Manner Coffee全国门店

前言 本文是该专栏的第25篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者在文章《Python爬虫-批量爬取星巴克全国门店》里面有详细介绍采集全国门店的方法以及完整代码思路。对此领域感兴趣的同学,可以点击翻阅查看即可。 而在本文中,笔者将详细来介…

【离散数学】关系

一、序偶和笛卡尔积 序偶&#xff1a;两个元素按照一定的次序组成的二元组&#xff0c;记为<x,y>&#xff0c;x为第一元素&#xff0c;y为第二元素 序偶的相等条件&#xff1a;<a,b><c,d>当且仅当ac,bd n重有序组&#xff1a;n个元素按照一定次序组成的n元…

前端css中table表格的属性使用

前端css中table表格的属性使用 一、前言二、常见的表格属性1.边框的样式2.布局和对齐3.间距和填充4.背景和颜色5.字体的样式6.边框的圆角 三、简单的表格&#xff0c;例子11.源码12.源码1效果截图 四、给表格添加动画效果&#xff0c;例子21.源码22.源码2的运行效果 五、结语六…

kkFileView 任意文件上传致远程代码执行漏洞复现(QVD-2024-14703)

0x01 产品简介 kkFileView 是使用 spring boot 搭建的文件文档在线预览解决方案,支持主流办公文档的在线预览。 0x02 漏洞概述 2024年4月,互联网上披露kkFileView远程代码执行漏洞情报,攻击者可利用该漏洞上传恶意文件,获取操作系统权限。该漏洞利用简单,建议受影响的客…

大数据学习的第三天

文章目录 学习大数据命令的方式查看文件拷贝文件的方式添加数据的方式 出现了问题移动文件 hadoop工作流程和工作机制的方式namenodedatanodesecondarynamenode(主节点) 学习大数据命令的方式 查看文件 hadoop fs -cat /test/2.txt下载文件 hadoop fs -get -f /test/2.txt-f …

基于深度学习的脑部肿瘤检测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 当大脑中形成异常细胞时&#xff0c;就会发生脑肿瘤。肿瘤主要有两种类型&#xff1a;癌性&#xff08;恶性&#xff09;肿瘤和良性肿瘤。恶性肿瘤可分为原发性肿瘤和继发性肿瘤&#xff0c;前者始…

全国产化无风扇嵌入式车载电脑农耕车辆/钢厂天车行业应用

农耕车辆行业应用 背景介绍 当前农耕车车载电脑主要的功能&#xff0c;是要实现农耕车的精确的定位和导航&#xff0c;更加先进的系统则要实现农耕车自动驾驶&#xff0c;与农耕车上相关传感器的通讯(例如耕土深度的传感器, 油量存量传感器…)来实现更多的自动化、信息化的功能…

NASA数据集——TANSO-FTS 运行前 11 年收集的测量数据中得出二氧化碳(CO2)干空气摩尔分数(XCO2)的估计值

ACOS GOSAT/TANSO-FTS Level 2 bias-corrected XCO2 and other select fields from the full-physics retrieval aggregated as daily files V7.3 (ACOS_L2_Lite_FP) at GES DISC 简介 ACOS Lite 文件包含经过偏差校正的 XCO2 以及其他选定字段的每日汇总文件。ACOS 2 级标准…

【Node.js】02 —— Path模块全解析

&#x1f31f;Node.js之Path模块探索&#x1f308; &#x1f4da;引言 在Node.js的世界中&#xff0c;path模块就像一把万能钥匙&#x1f511;&#xff0c;它帮助我们理解和操作文件与目录的路径。无论你是初入Node.js殿堂的新手&#xff0c;还是久经沙场的老兵&#xff0c;理…

最短路问题之Dijkstra算法 洛谷 单源最短路径

Dijkstra算法具体解释 Dijkstra算法用于解决单源最短路径问题&#xff0c;即找出从一个源节点到其他所有节点的最短路径。该算法的前提是图中不能有负权边&#xff0c;因为它基于贪心策略。Dijkstra算法的基本思想是通过逐步确定到达每个节点的最短路径长度来求解问题。其主要…

十、使用repo管理yocto各个layer

文章目录 使用repo管理yocto各个layer一、创建repo环境二、创建rpi robot的manifest三、实践 使用repo管理yocto各个layer 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第十篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于raspberrypi…