数据库拆分4--sharding-jdbc-spring-boot-starter自动装配启动过程

news2024/9/24 1:19:56

学习一下springboot是如何整合sharding-jdbc的。

添加依赖以后

   <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
</dependency>

由于springboot自动装配可知会自动加载这个类

org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration

SpringBootConfiguration实现了接口EnvironmentAware 其主要属性如下:
private final SpringBootShardingRuleConfigurationProperties shardingRule;
    private final SpringBootMasterSlaveRuleConfigurationProperties masterSlaveRule;
    private final SpringBootEncryptRuleConfigurationProperties encryptRule;
    private final SpringBootShadowRuleConfigurationProperties shadowRule;
    private final SpringBootPropertiesConfigurationProperties props;
    private final Map<String, DataSource> dataSourceMap = new LinkedHashMap();
    private final String jndiName = "jndi-name";

主要用来读取各种配置项,结合配置文件:

spring.shardingsphere.datasource.names=wim-user,wim-order

spring.shardingsphere.datasource.wim-user.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.wim-user.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.wim-user.url=jdbc:mysql://127.0.0.1:3306/wim-user?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.wim-user.username=root
spring.shardingsphere.datasource.wim-user.password=123456

spring.shardingsphere.datasource.wim-order.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.wim-order.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.wim-order.url=jdbc:mysql://127.0.0.1:3306/wim-order?serverTimezone=UTC&useSSL=false
spring.shardingsphere.datasource.wim-order.username=root
spring.shardingsphere.datasource.wim-order.password=123456

spring.shardingsphere.sharding.tables.user_t.actual-data-nodes=wim-user.user_t
spring.shardingsphere.sharding.tables.log_t.actual-data-nodes=wim-user.log_t

#spring.shardingsphere.sharding.tables.user_t.table-strategy.inline.sharding-column=user_id
#spring.shardingsphere.sharding.tables.user_t.table-strategy.inline.algorithm-expression=user_t
#
#spring.shardingsphere.sharding.tables.log_t.table-strategy.inline.sharding-column=user_id
#spring.shardingsphere.sharding.tables.log_t.table-strategy.inline.algorithm-expression=log_t


spring.shardingsphere.sharding.default-data-source-name=wim-order
spring.shardingsphere.props.sql.show=true
spring.shardingsphere.datasource前缀会自动解析成数据源 dataSourceMap
spring.shardingsphere.sharding前缀会自动解析成数据库分片配置 shardingRule
spring.shardingsphere.props前缀会解析成属性配置 props

其余几个配置

masterSlaveRule 读写分离配置
encryptRule加密配置
shadowRule影子表配置

在setEnvironment方法中实现数据源的配置项加载和初始化

 public final void setEnvironment(Environment environment) {
        String prefix = "spring.shardingsphere.datasource.";
        Iterator var3 = this.getDataSourceNames(environment, prefix).iterator();

        while(var3.hasNext()) {
            String each = (String)var3.next();

            try {
                this.dataSourceMap.put(each, this.getDataSource(environment, prefix, each));
            } catch (ReflectiveOperationException var6) {
                throw new ShardingSphereException("Can't find datasource type!", var6);
            } catch (NamingException var7) {
                throw new ShardingSphereException("Can't find JNDI datasource!", var7);
            }
        }

    }

此时dataSourceMap中含有所有配置的数据源配置项,容器启动时具体使用何种数据源由相应配置项来决定

public final class ShardingRuleCondition extends SpringBootCondition {
    public ShardingRuleCondition() {
    }

    public ConditionOutcome getMatchOutcome(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        boolean isMasterSlaveRule = (new MasterSlaveRuleCondition()).getMatchOutcome(conditionContext, annotatedTypeMetadata).isMatch();
        boolean isEncryptRule = (new EncryptRuleCondition()).getMatchOutcome(conditionContext, annotatedTypeMetadata).isMatch();
        boolean isShadow = (new ShadowRuleCondition()).getMatchOutcome(conditionContext, annotatedTypeMetadata).isMatch();
        return !isMasterSlaveRule && !isEncryptRule && !isShadow ? ConditionOutcome.match() : ConditionOutcome.noMatch("Have found master-slave or encrypt rule in environment");
    }
}

如果有spring.shardingsphere.masterslave.name加载主从数据源模式

如果有spring.shardingsphere.encrypt.encryptors加载加密数据源模式

如果有spring.shardingsphere.shadow加载主从数据源模式其他则加载影子库数据源模式

由于我们只配置了分片规则,因此会初始化shardingDataSource

@Bean
    @Conditional({ShardingRuleCondition.class})
    public DataSource shardingDataSource() throws SQLException {
        return ShardingDataSourceFactory.createDataSource(this.dataSourceMap, (new ShardingRuleConfigurationYamlSwapper()).swap(this.shardingRule), this.props.getProps());
    }

因此容器中最终的数据源对象为ShardingDataSource

 public static DataSource createDataSource(Map<String, DataSource> dataSourceMap, ShardingRuleConfiguration shardingRuleConfig, Properties props) throws SQLException {
        return new ShardingDataSource(dataSourceMap, new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()), props);
    }

ShardingDataSource数据源中通过ShardingRuntimeContext对象来实现上下文对象保存和传递以及功能增强

 private final ShardingRuntimeContext runtimeContext;

    public ShardingDataSource(Map<String, DataSource> dataSourceMap, ShardingRule shardingRule, Properties props) throws SQLException {
        super(dataSourceMap);
        this.checkDataSourceType(dataSourceMap);
        this.runtimeContext = new ShardingRuntimeContext(dataSourceMap, shardingRule, props, this.getDatabaseType());
    }
ShardingRuntimeContext中主要包括 缓存的数据源元数据信息以及事务管理器
 private final CachedDatabaseMetaData cachedDatabaseMetaData;
    private final ShardingTransactionManagerEngine shardingTransactionManagerEngine;

    public ShardingRuntimeContext(Map<String, DataSource> dataSourceMap, ShardingRule shardingRule, Properties props, DatabaseType databaseType) throws SQLException {
        super(dataSourceMap, shardingRule, props, databaseType);
        this.cachedDatabaseMetaData = this.createCachedDatabaseMetaData(dataSourceMap);
        this.shardingTransactionManagerEngine = new ShardingTransactionManagerEngine();
        this.shardingTransactionManagerEngine.init(databaseType, dataSourceMap);
    }

 应用启动后加载的数据库元数据相关信息

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

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

相关文章

Java8之JMX与MBean

参考文章&#xff1a; 《JMX超详细解读》 《JMX》 写在开头&#xff1a;本文为学习后的总结&#xff0c;可能有不到位的地方&#xff0c;错误的地方&#xff0c;欢迎各位指正。 在学习tomcat源码架构的时候了解到其中使用了JMX来实现一些管理工作&#xff0c;于是便整理了这篇…

Linux systemd-run unit封装CGroup资源进行任务运行

Linux systemd-run 封装资源使用 序 之前我们讲了关于 systemctl 对各种服务或者说是 unit 进行了讲解&#xff0c;也讲了怎么创建一个 unit&#xff0c;进行相关配置或者依赖设置等等。在使用 systemctl status xxx 时&#xff0c;我们可以发现对应的资源使用情况&#xff0…

JSTL标签库 | 深入解析JSTL标签库

目录 一&#xff1a;深入解析JSTL标签库 1、什么是JSTL标签库 2、使用JSTL标签库的步骤 3、JSTL标签的原理 4、jstl中的核心标签库core当中常用的标签 一&#xff1a;深入解析JSTL标签库 1、什么是JSTL标签库 ①Java Standard Tag Lib&#xff08;Java标准的标签库&am…

电脑文件不小心删除了怎么恢复 ? 删除的文件如何恢复文件?

如果误删电脑文件后&#xff0c;如何恢复文件&#xff1f; 电脑删除文件是很经常的事&#xff0c;为了电脑运行更快我们经常都会清理&#xff0c;但是有时候也会出现不小心删除重要文件的情况。如何恢复删除的文件&#xff1f;本文总结的2种常用方法可以帮助到你。 方法1、注册…

惠普CP1025 因转印离合器导致打印不全大片空白的问题

问题症状 自检只打印出一部分, 后面大部分都是空白. 如果是碳盒缺粉, 应该是均匀地浅或者空白, 如果是成像鼓的问题, 应该是从上到下成条状的不均匀, 这样显示一节后空白的情况是没见过, 上网查有类似的问题 惠普CP1025彩色激光打印机打印图像前半部有字后半部白纸惠普1025打印…

Java框架:Spring框架

文章目录一、Spring概念二、Spring特征三、Spring基本架构3.1Spring体系结构3.2Core Container(核心容器)3.3Data Access/Integration(数据访问/集成)3.4Web(MVC/Remoting)3.5Test(测试)3.6AOP(面向切面编程)四、Spring主要jar包五、Spring用到的设计模式一、Spring概念 什么是…

vue学习笔记(三)-组件化编程基础

概念 传统方式与组件化对比 存在问题 1.依赖关系混乱 2.代码复用率不高 模块与组件、模块化与组件化的关系 模块 a.理解&#xff1a;向外提供特定功能的 js 程序&#xff0c;一般就是一个 js 文件 b.为什么&#xff1a;js 文件很多很复杂 c.作用&#xff1a;复用、简化 …

【Docker技术内幕】(十二)使用docker安装Kafka

目录 一、准备工作 1、安装docker 2、设置加速镜像 二、开始安装 1、启动容器 三、验证Kafka是否安装成功 四、部署kafka-manager 一、准备工作 1、安装docker 参考 【Docker技术内幕】&#xff08;四&#xff09;Linux环境下安装docker 2、设置加速镜像 vim /etc/do…

C语言 数据存储 char int 数据存储 关于原码反码补码

上图 前五个整形是整形家族&#xff0c;为什么char也是 因为他是字符型 字符实际存储的时候寸的是这个的ascll值 ascll值是个整数 除了以上两种 还有构造类型 又叫自定义类型 为什么又数组类型 如下代码 arr和【】的内容都可以自定义 为什么出现以上情况.(ffff 是16进制表示…

第二证券|通过磁铁制造功率更大的电动汽车电池

德克萨斯大学奥斯汀分校的研讨人员表明&#xff0c;一个更厚的电极&#xff0c;经过磁优化的离子道路&#xff0c;能够使充电更快&#xff0c;充电之间的功率更大。 研讨人员制作了一种具有‘快速通道’摆放的电极&#xff0c;以进步充电速度和续航路程。 研讨人员发现了一种共…

Apache Hudi 数据湖介绍

目录​​​​​​​ Apache Hudi 数据湖介绍 Hudi 历程 Hudi Features Apache Hudi 数据湖介绍 Apache Hudi&#xff08;发音为“hoodie”&#xff09;是下一代流媒体数据湖平台源于Uber 。Apache Hudi将核心仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的追加…

[附源码]Nodejs计算机毕业设计基于云数据库的便民民宿租赁系统Express(程序+LW)

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

人人都能看懂的Spring底层原理,看完绝对不会懵逼

人人都能看懂的Spring原理&#xff0c;绝对不会懵逼为什么要使用Spring&#xff1f;Spring的核心组件Spring是如何实现IOC和DI的&#xff1f;定义了BeanDefinition扫描加载BeanDefinition根据BeanDefinition进行Bean的实例化和初始化实例化属性赋值保存到单例缓冲池一个Bean从创…

docker高级篇2-分布式存储之三种算法

面试题&#xff1a; 1~2亿条数据需要缓存&#xff0c;请问如何设计这个缓存案例&#xff1f; 答&#xff1a;单机单台100%是不可能的。肯定是分布式缓存的。那么用Redis如何落地&#xff1f; 一般有三种方案&#xff1a; 哈希取余分区&#xff1b;一致性哈希算法分区&#…

HttpRunner4.x 安装与使用

HttpRunner4.x 安装与使用HttpRunner4.x 安装与使用安装使用运行脚手架项目方式一&#xff1a;录制生成用例步骤1&#xff1a;导出har文件步骤2&#xff1a;转化成测试用例文件步骤3&#xff1a;执行测试用例方式二&#xff1a;手工编写测试用例HttpRunner4.x 安装与使用 以下…

卡塔尔世界杯终局之战,阿根廷VS法国,是老将加冕还是新王登基?

【世界杯】阿根廷VS法国 不知不觉&#xff0c;世界杯已经走到最后的尾声&#xff0c;此前经历的28天&#xff0c;63场比赛皆是铺垫&#xff0c;卢赛尔体育场将会迎来2022卡塔尔世界杯最终的决赛&#xff0c;究竟是梅西球王加冕还是法国卫冕世界杯冠军&#xff0c;今晚23&#x…

KNN算法 鸢尾花种类预测

目录 一&#xff1a;KNN原理 二&#xff1a;数据处理 三&#xff1a;超参调试、模型保存及使用 四&#xff1a;鸢尾花种类预测 详细步骤 一&#xff1a;KNN原理 从训练集中找到跟待测数据最近的k条记录 根据这些记录的分类决定新数据的分类 主要因素包括有&#xff1a;K邻…

java------JVM之类加载和双亲委派机制

类加载器&#xff1a;加载.class文件。 将新建的对象放入堆里面&#xff0c;而对象的引用(地址)放到栈&#xff0c;其中引用指向堆里面对应的对象。 1-启动类加载器&#xff0c;负责加载jre\lib目录下的rt.jar包c编写&#xff0c;加载java核心库 java.*,构造ExtClassLoader和A…

[CocosCreator]封装行为树(一)

(老规矩:广告位留给自己) 欢迎喜欢或者从事CocosCreator开发的小伙伴请加入我的大家庭CocosCreator游戏开发Q群:26855530 行为树的定义:控制AI实体决策流程的分层节点树。游戏中Npc的活动,或者主角挂机行为都十分依赖行为树,本章开始,封装适用CococCreator使用的TypeScript行…

Mongo基本操作

文章目录核心概念库<DataBase>集合<Collection>文档<Document>MySQL与MongoDB关系总结基本操作库<database>集合<Collection>文档<document>文档查询ANDORAND 和 OR 联合模糊查询排序分页总条数去重指定返回字段索引<index>操作复合…