springboot 配置多数据源以及动态切换数据源
场景
我们springboot项目,通常会有多个数据库,例如mysql,vertica,postgresql等等数据库,通常我们需要动态切换使用我们想要的数据库,这时候就需要配置多数据源了
多数据源特性
支持多数据库类型:例如,同时连接 MySQL、PostgreSQL 和 Vertica 等不同数据库,在应用中能够根据不同的业务需求切换到对应的数据库。
动态数据源切换:根据请求、业务逻辑或用户上下文,动态切换数据源(例如,按用户请求切换到不同的数据库),而不需要重启应用。
数据库隔离:不同业务模块使用不同的数据源,确保它们的数据完全隔离。例如,一个模块使用 MySQL,另一个模块使用 Vertica。
高可用和容错:通过配置多个数据源,可以在主数据库发生故障时自动切换到备用数据库,提升系统的高可用性。
实现
基于springboot3.4配置
引入依赖的方式
添加依赖
<!--动态数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>4.3.0</version></dependency>
配置YML文件
spring:datasource:dynamic:# 设置默认的数据源或者数据源组,默认值即为 masterprimary: masterdatasource:master:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: 123456slave:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/eshopping?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: 123456
调用数据库
直接再类上加上@DS(“master”)注解即是连接的master数据库
@Service
@DS("master")
public class LoginServiceImpl implements LoginService{
问题
博主这里遇见了问题,因为我配置了JWT+SpringSecurity,这里报错了,信息如下,找不到数据源,猜想应该是和JwtAuthenticationFilter和数据源的加载顺序有关
2025-01-21 21:43:37.097 ERROR --- [ main] o.s.b.web.embedded.tomcat.TomcatStarter : Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'jwtAuthenticationFilter': Unsatisfied dependency expressed through field 'userDetailsService': Error creating bean with name 'customUserDetailsService': Unsatisfied dependency expressed through field 'loginMapper': Error creating bean with name 'loginMapper' defined in file [E:\IDE\demoNew\target\classes\com\example\demonew\mapper\loginMapper\LoginMapper.class]: Cannot resolve reference to bean 'sqlSessionTemplate' while setting bean property 'sqlSessionTemplate'
2025-01-21 21:43:37.134 INFO --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2025-01-21 21:43:37.155 WARN --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server
2025-01-21 21:43:37.167 INFO --- [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2025-01-21 21:43:37.210 ERROR --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ***************************
APPLICATION FAILED TO START
***************************Description:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver classAction:Consider the following:If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.If you have database settings to be loaded from a particular profile you may need to activate it (the profiles dev are currently active).
手动实现
依赖默认已经引入,就是基础的mysql,mybatis依赖
配置YML文件
spring:datasource:master:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: 123456slave:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/eshopping?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: 123456
配置DataSourceContextHolder
创建DataSourceContextHolder 类通过ThreadLocal存储数据源信息
/*DataSourceContextHolder 类用于保存当前线程的数据库标识,通常使用 ThreadLocal 来保存当前的数据源。*/
public class DataSourceContextHolder {private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();public static void setDataSourceType(String dataSourceType) {contextHolder.set(dataSourceType);}public static String getDataSourceType() {return contextHolder.get();}public static void clearDataSourceType() {contextHolder.remove();}
}
创建DynamicDataSource
创建DynamicDataSource 类继承AbstractRoutingDataSource ,可获取当前线程数据源信息
/*DynamicDataSource 类继承自 AbstractRoutingDataSource,用于根据当前线程的上下文动态选择数据源。*/
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {// 获取当前线程中的数据源标识return DataSourceContextHolder.getDataSourceType();}
}
配置DataSourceConfig
配置DataSourceConfig类,将配置文件的中的数据源配置成bean,然后存入DataSourceContextHolder 类中的ThreadLocal中存储
/*配置一个 DynamicDataSource,将多个 DataSource 放入其中,并设置默认数据源。*/
@Configuration
public class DataSourceConfig {@Primary@Bean(name = "masterDataSource")@ConfigurationProperties("spring.datasource.master")public HikariDataSource primaryDataSource() {return new HikariDataSource();}@Bean(name = "slaveDataSource")@ConfigurationProperties("spring.datasource.slave")public HikariDataSource secondaryDataSource() {return new HikariDataSource();}@Beanpublic DataSource dataSource() {Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put("masterDataSource", primaryDataSource());targetDataSources.put("slaveDataSource", secondaryDataSource());DynamicDataSource routingDataSource = new DynamicDataSource();routingDataSource.setDefaultTargetDataSource(primaryDataSource());routingDataSource.setTargetDataSources(targetDataSources);return routingDataSource;}}
使用
在serviceImpl中使用
主要是用下面的方法切换数据源DataSourceContextHolder.setDataSourceType(“masterDataSource”);
@Service
public class LoginServiceImpl implements LoginService{@Autowiredprivate LoginMapper loginMapper;@Overridepublic String register(String username, String password) {return "成功";}@Overridepublic String login(String username, String password) {DataSourceContextHolder.setDataSourceType("masterDataSource");String pw = loginMapper.login(username);if(password.equals(pw)){return "成功";}else {return "失败";}}}
清除
ThreadLocal不使用之后需要remove,不然容易造成数据污染或错误
原因
ThreadLocal 是与线程绑定的,在 Spring 或类似的框架中,线程池通常会重用线程,如果在请求处理过程中没有清理 ThreadLocal 中的内容,接下来复用的线程可能会带着之前请求中的 ThreadLocal 数据继续处理新的请求,从而导致数据污染或错误。
假设你有两个数据源:primary 和 secondary,当请求 A 处理时,ThreadLocal 设置了 primary 数据源。
如果线程 A 继续处理请求 B,但此时没有清理 ThreadLocal,那么请求 B 可能会意外地使用 primary 数据源,而不是它本该使用的 secondary 数据源。
手动实现(注解版本)推荐
上面的版本每次都需要DataSourceContextHolder.setDataSourceType(“masterDataSource”);切换数据源非常麻烦,因此可以自定义注解
自定义注解
使用@DataSource时默认值masterDataSource
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSource {String value() default "masterDataSource"; // 默认是 master 数据源
}
定义AOP切面
在使用该注解前将值赋值给DataSourceContextHolder中ThreadLocal存储,并可以方便的清除数据源
@Aspect
@Component
public class DataSourceAspect {@Before("@annotation(dataSource)")public void switchDataSource(DataSource dataSource) {String dataSourceType = dataSource.value();DataSourceContextHolder.setDataSourceType(dataSourceType);}@After("@annotation(dataSource)")public void clearDataSource(DataSource dataSource) {DataSourceContextHolder.clearDataSourceType();}@AfterThrowing("@annotation(dataSource)")public void handleException(DataSource dataSource) {DataSourceContextHolder.clearDataSourceType();}
}
使用
@Service
public class LoginServiceImpl implements LoginService{@Autowiredprivate LoginMapper loginMapper;@Overridepublic String register(String username, String password) {return "成功";}@Override@DataSource("slaveDataSource")public String login(String username, String password) {String pw = loginMapper.login(username);if(password.equals(pw)){return "成功";}else {return "失败";}}}
相关文章:
springboot 配置多数据源以及动态切换数据源
场景 我们springboot项目,通常会有多个数据库,例如mysql,vertica,postgresql等等数据库,通常我们需要动态切换使用我们想要的数据库,这时候就需要配置多数据源了 多数据源特性 支持多数据库类型:例如,同…...
计算机图形学:实验三 光照与阴影
一、程序功能设计 设置了一个3D渲染场景,支持通过键盘和鼠标控制交互,能够动态调整光源位置、物体材质参数等,具有光照、阴影和材质效果的场景渲染。 OpenGL物体渲染和设置 创建3D物体:代码中通过 openGLObject 结构体表示一个…...
idea修改模块名导致程序编译出错
本文简单描述分别用Idea菜单、pom.xml文件管理项目模块module 踩过的坑: 通过idea菜单创建模块,并用idea菜单修改模块名,结构程序编译报错,出错的代码莫名奇妙。双击maven弹窗clean时,还是报错。因为模块是新建的&am…...
Arcgis国产化替代:Bigemap Pro正式发布
在数字化时代,数据如同新时代的石油,蕴含着巨大的价值。从商业决策到科研探索,从城市规划到环境监测,海量数据的高效处理、精准分析与直观可视化,已成为各行业突破发展瓶颈、实现转型升级的关键所在。历经十年精心打磨…...
RNN实现阿尔茨海默症的诊断识别
本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…...
大数据学习(36)- Hive和YARN
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析
在Windows系统中,你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效,如图: 你可以使用以下代码: import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …...
计算机的错误计算(二百二十一)
摘要 利用一个数学解题器化简计算 实验表明,即使是数学解题器,也是一派胡言。 有一读者来信,询问数学大模型的推理事宜。现就前面的案例继续做一讨论。 例1. 化简计算摘要中算式。 下面是与一个数学解题器的对话。 点评: &am…...
小利特惠源码/生活缴费/电话费/油卡燃气/等充值业务类源码附带承兑系统
全新首发小利特惠/生活缴费/电话费/油卡燃气/等充值业务类源码附带U商承兑系统 安装教程如下 图片:...
外部flash烧写算法学习笔记(一)
一,STM32CubeProgrammer STM32下载编程工具 | STM32CubeProg介绍、下载、安装和使用教程 - 知乎 1.使用速览 2.外部烧写 二,QSPI外部烧写算法制作 STM32H7的花式玩转SPI Flash章节也更新了,含MDK下载算法制作和STM32CubeProg下载算法制作 …...
嵌入式MCU面试笔记2
目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道,通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…...
差分轮算法-两个轮子计算速度的方法-阿克曼四轮小车计算方法
四轮驱小车的话: 转向角度计算方法:float turning_angle z_angular / x_linear; // 转向角度,单位为弧度 速度的话直接用线速度 两轮驱动小车: 计算公式: leftSpeed x_linear - z_angular * ORIGINBOT_WHEEL_TRACK /…...
解释器模式
在软件开发的诸多场景中,我们有时需要处理特定领域的语言或表达式。例如,在数据库查询中,我们使用 SQL 语句来查询数据;在数学计算软件里,需要解析和计算各种数学表达式。解释器模式(Interpreter Pattern&a…...
代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)
目录 一、链表理论基础 二、链表相交求解思路 三、相关算法题目 四、疑点 一、链表理论基础 代码随想录 二、链表相交求解思路 链表相交时,是结点的位置,也就是指针相同,不是结点的数值相同; 思路:定义两个指针…...
戴尔电脑用u盘重装系统_戴尔电脑用u盘重装win10系统教程
戴尔电脑用u盘重装系统?戴尔电脑这几年默认预装win10家庭版和win11家庭版。有的用户用上了预装win11家庭版的戴尔电脑,使用一段时间依然不习惯,于是想退回win10。但不知道怎么重装win10,这几年的戴尔电脑建议采用U盘方式安装系统比…...
http的请求体各项解析
一、前言 做Java开发的人员都知道,其实我们很多时候不单单在写Java程序。做的各种各样的系统,不管是PC的 还是移动端的,还是为别的系统提供接口。其实都离不开http协议或者https 这些东西。Java作为编程语言,再做业务开发时&#…...
【MARK】Cline配合FreeAPI,再薅亿点点token
说明 自从用了cline,token消耗的速度就开始起飞。各家免费的几百万Token,看起来挺多,实际用起来还是顶不住几天~ FreeAPI是个简单的替代,上下文长度还是不如官方API,所以还是推荐使用官方,这个只是玩具&a…...
如何使用CRM数据分析优化销售和客户关系?
嘿,大家好!你有没有想过为什么有些公司在市场上如鱼得水,而另一些却在苦苦挣扎?答案可能就藏在他们的销售策略和客户关系管理(CRM)系统里。今天我们要聊的就是如何通过有效的 CRM 数据分析来提升你的销售额…...
c语言数组详解
前言 一、数组的定义: 二、数组的初始化: 1.如何给数组赋初值: 1.1逐个赋值: 1.2使用花括号初始化: 1.3使用等号赋值: 2.不同的初始化方式 2.1使用循环初始化: 2.2使用默认初始化: 三…...
EasyNVR免费版已发布!EasyNVR接入海康NVR大华NVR宇视NVR天地伟业NVR接入各种IPC摄像机工业监控家庭监控
EasyNVR不用多说了,驰名已久!之前一直是收费的,不管多少个摄像机接入都是收费的,这就导致,很多个人用户,或者说是家庭用户,家里就那么两三个摄像机,想通过EasyNVR接入NAS系统&#x…...
GSI快速收录服务:让你的网站内容“上架”谷歌
辛苦制作的内容无法被谷歌抓取和展示,导致访客无法找到你的网站,这是会让人丧失信心的事情。GSI快速收录服务就是为了解决这种问题而存在的。无论是新上线的页面,还是长期未被收录的内容,通过我们的技术支持,都能迅速被…...
vue2的$el.querySelector在vue3中怎么写
这个也属于直接操作 dom 了,不建议在项目中这样操作,不过我是在vue2升级vue3的时候遇到的,是以前同事写的代码,也没办法 先来看一下对比 在vue2中获取实例是直接通过 this.$refs.xxx 获取绑定属性 refxxx 的实例,并且…...
C++ list 容器用法
C list 容器用法 C 标准库提供了丰富的功能,其中 <list> 是一个非常重要的容器类,用于存储元素集合,支持双向迭代器。<list> 是 C 标准模板库(STL)中的一个序列容器,它允许在容器的任意位置快速…...
双目立体校正和Q矩阵
立体校正 对两个摄像机的图像平面重投影,使二者位于同一平面,而且左右图像的行对准。 Bouguet 该算法需要用到双目标定后外参(R,T) 从上图中可以看出,该算法主要分为两步: 使成像平面共面 这个办法很直观ÿ…...
又是一年啊
又是一年 回顾2024一、2024的愿望二、愿望实现了吗?三、总结 展望2025几个愿望~~(终于快写完了)~~ 华丽结尾 回顾2024 一、2024的愿望 1.CSP-J上岸; 2.小升初上岸; 3.数学进入联赛班; 4.初一期末年级前五…...
Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅
一、引言 在当今数字化时代,构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架,以其快速开发、简洁配置和丰富的生态支持,深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架ÿ…...
简识JVM私有内存区域栈、数据结构
前记:JVM稀有内存区域栈包含:虚拟机栈、本地方法栈、程序计数器; 在JVM(Java虚拟机)中,私有内存区域栈主要指的是虚拟机栈(VM Stack)和本地方法栈(Native Method Stack&…...
【C++基础】多线程并发场景下的同步方法
如果在多线程程序中对全局变量的访问没有进行适当的同步控制(例如使用互斥锁、原子变量等),会导致多个线程同时访问和修改全局变量时发生竞态条件(race condition)。这种竞态条件可能会导致一系列不确定和严重的后果。…...
【优选算法】10----无重复字符的最长子串
---------------------------------------begin--------------------------------------- 题目解析: 看到这一类题目,有没有那种一眼就感觉时要用到滑动窗口的感觉,铁子们? 讲解算法原理: 方法一: 暴力解法ÿ…...
C语言程序设计十大排序—冒泡排序
文章目录 1.概念✅2.冒泡排序🎈3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一,每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法,排序后的数据更易于处理和查找。在计算机发展…...
26考研资料分享 百度网盘
基础班: 通过网盘分享的文件:2026【考研数学】等3个文件 链接:https://pan.baidu.com/s/1djzJiut1h0DH8WmrI05YHg?pwd1234 提取码:1234--来自百度网盘超级会员v3的分享 通过网盘分享的文件:01、2026【考研政治】 链接:https://pan.baidu.…...
C++ lambda表达式
目录 1.lambda表达式 1.1什么是Lambda表达式? 1.2Lambda表达式的语法 1.3捕捉列表 1.4函数对象与lambda表达式 1.lambda表达式 1.1什么是Lambda表达式? Lambda表达式是C11标准引入的一种匿名函数,它允许你在需要函数的地方直接编写代码…...
halo附件图片迁移到easyimage图床
前言 在使用 markdown 编写文章之后,markdown 内容中引用的图片都是图床的地址 部分文章是在 halo 没有使用图床前,就已经发布了的,这些图片都是直接存储在 halo 系统中的 需要将这些文章的图片全部迁移到图床上,这些文章的图片…...
Grafana
Grafana 是一款广泛使用的开源数据可视化与监控平台,通过与 Prometheus、InfluxDB、Elasticsearch 等多种数据源集成,提供强大的监控、数据展示和告警功能。其告警体系在及时通知系统异常、保障业务稳定性方面起到关键作用。 Grafana 告警体系概述 Graf…...
前端性能优化:HMR热更新和预获取加载
最近发现项目开发,有点加载快,有点却是卡机式,甚至刷新导致白屏情况。于是,我找开发和性能优化的方法,找到下面几种。 本文将深入探讨 预获取(Prefetch)、动态导入(Dynamic Import&…...
OpenCV相机标定与3D重建(66)对立体匹配生成的视差图(disparity map)进行验证的函数validateDisparity()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用左右检查来验证视差。矩阵 “cost” 应该由立体对应算法计算。 cv::validateDisparity 函数是 OpenCV 库中用于对立体匹配生成的视差图&…...
git reset (取消暂存,保留工作区修改)
出现这种情况的背景:我不小心把node_modules文件添加到暂存区了,由于文件过大,导致不能提交,所以我想恢复之前的状态,但又不想把修改的代码恢复为之前的状态,所以使用这个命令可以只恢复暂存区的状态&#…...
【论文+源码】diffuseq使用扩散模型和diffuseq-v2的序列文本生成序列,并且桥接离散和连续的文本空间,用于加速SEQ2SEQ扩散模型。
这篇论文介绍了一种名为DIFFUSEQ的新型扩散模型,专门针对序列到序列(SEQ2SEQ)文本生成任务进行设计。尽管扩散模型在视觉和音频等连续信号领域取得了成功,但在自然语言处理特别是条件生成方面的适应仍然未被广泛探索。通过广泛的评…...
考研机试题:打印日期
描述 给出年分m和一年中的第n天,算出第n天是几月几号。 输入描述: 输入包括两个整数y(1<y<3000),n(1<n<366)。 输出描述: 可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。 …...
Ubuntu 20.04 x64下 编译安装ffmpeg
试验的ffmpeg版本 4.1.3 本文使用的config命令 ./configure --prefixhost --enable-shared --disable-static --disable-doc --enable-postproc --enable-gpl --enable-swscale --enable-nonfree --enable-libfdk-aac --enable-decoderh264 --enable-libx265 --enable-libx…...
springboot使用ssl连接elasticsearch
使用es时ssl证书报错 unable to find valid certification path to requested target 1.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>2…...
虚拟头节点和双指针解决链表问题(合并,与分解操作,力扣题目为例)
Problem: 21. 合并两个有序链表 Problem: 86. 分隔链表 文章目录 总览说明题目描述思路复杂度Code总结分析 总览说明 在解决链表相关的算法题目时较多使用到的技巧就是虚拟头节点、双指针,而题目往往都会涉及到对链表的分解、合并操作,本文选择两个题目将…...
JavaScript系列(38)-- WebRTC技术详解
JavaScript WebRTC技术详解 🎥 今天,让我们深入了解WebRTC(Web Real-Time Communication)技术,这是一种支持网页浏览器进行实时语音对话或视频对话的技术。 WebRTC基础概念 🌟 💡 小知识&…...
分布式理解
分布式 如何理解分布式 狭义的分布是指,指多台PC在地理位置上分布在不同的地方。 分布式系统 分布式系**统:**多个能独立运行的计算机(称为结点)组成。各个结点利用计算机网络进行信息传递,从而实现共同的“目标或者任…...
JVM学习指南(48)-JVM即时编译
文章目录 即时编译(Just-In-Time Compilation, JIT)概述为什么JVM需要即时编译?即时编译与传统的静态编译的区别JVM中的即时编译器HotSpot VM中的C1和C2编译器编译器的作用和位置即时编译的工作流程代码的加载和解释执行热点代码检测编译优化编译优化技术公共子表达式消除循…...
python http调用视觉模型moondream
目录 一、什么是moondream 二、资源地址 三、封装了http进行接口请求 四、代码解析 解释 可能的改进 一、什么是moondream Moondream 是一个针对视觉生成任务的深度学习模型,专注于图像理解和生成,包括图像标注(captioning)、问题回答(Visual Question Answering,…...
【竞技宝】DOTA2:NAVI junior被ESL取消参赛资格
北京时间1月24日,DOTA2目前有多个赛事的预选赛正在如火如荼的进行之中,其中ESLOne罗利站的预选赛已经结束,参赛正赛的队伍也已经全部产生。除了因EPT积分而拿到直邀资格的PARI、BB、falcons、liquid之外,tundra、NAVI junior、spirit、nigma、XG、talon、SR、HEROIC也通过各赛区…...
Java 在包管理与模块化中的优势:与其他开发语言的比较
在开发复杂的、规模庞大的软件系统时,包管理和模块化设计起着至关重要的作用。它们不仅决定了代码的组织和可维护性,还直接影响到团队协作效率、扩展性和性能。在众多编程语言中,Java 凭借其成熟的生态系统、强类型系统和标准化的包管理机制&…...
如何用数据编织、数据虚拟化与SQL-on-Hadoop打造实时、可扩展兼容的数据仓库?
在大数据技术迅猛发展的背景下,许多人认为传统数据仓库已过时。然而,这种观点忽略了数据仓库的核心价值:统一的数据视图、强大的业务逻辑支撑以及丰富的数据分析能力。在企业数据架构转型中,数据仓库不仅未被淘汰,反而…...
MVCC底层原理实现
MVCC的实现原理 了解实现原理之前,先理解下面几个组件的内容 1、 当前读和快照读 先普及一下什么是当前读和快照读。 当前读:读取数据的最新版本,并对数据进行加锁。 例如:insert、update、delete、select for update、 sele…...