当前位置: 首页 > news >正文

Apache Doris 入门教程35:多源数据目录

概述

多源数据目录(Multi-Catalog)功能,旨在能够更方便对接外部数据目录,以增强Doris的数据湖分析和联邦数据查询能力。

在之前的 Doris 版本中,用户数据只有两个层级:Database 和 Table。当我们需要连接一个外部数据目录时,我们只能在Database 或 Table 层级进行对接。比如通过 create external table 的方式创建一个外部数据目录中的表的映射,或通过 create external database 的方式映射一个外部数据目录中的 Database。 如果外部数据目录中的 Database 或 Table 非常多,则需要用户手动进行一一映射,使用体验不佳。

而新的 Multi-Catalog 功能在原有的元数据层级上,新增一层Catalog,构成 Catalog -> Database -> Table 的三层元数据层级。其中,Catalog 可以直接对应到外部数据目录。目前支持的外部数据目录包括:

  1. Apache Hive
  2. Apache Iceberg
  3. Apache Hudi
  4. Elasticsearch
  5. JDBC: 对接数据库访问的标准接口(JDBC)来访问各式数据库的数据。
  6. Apache Paimon(Incubating)

该功能将作为之前外表连接方式(External Table)的补充和增强,帮助用户进行快速的多数据目录联邦查询。

基础概念​

  1. Internal Catalog

    Doris 原有的 Database 和 Table 都将归属于 Internal Catalog。Internal Catalog 是内置的默认 Catalog,用户不可修改或删除。

  2. External Catalog

    可以通过 CREATE CATALOG 命令创建一个 External Catalog。创建后,可以通过 SHOW CATALOGS 命令查看已创建的 Catalog。

  3. 切换 Catalog

    用户登录 Doris 后,默认进入 Internal Catalog,因此默认的使用和之前版本并无差别,可以直接使用 SHOW DATABASESUSE DB 等命令查看和切换数据库。

    用户可以通过 SWITCH 命令切换 Catalog。如:

    SWITCH internal;
    SWITCH hive_catalog;
    

    切换后,可以直接通过 SHOW DATABASESUSE DB 等命令查看和切换对应 Catalog 中的 Database。Doris 会自动通过 Catalog 中的 Database 和 Table。用户可以像使用 Internal Catalog 一样,对 External Catalog 中的数据进行查看和访问。

    当前,Doris 只支持对 External Catalog 中的数据进行只读访问。

  4. 删除 Catalog

    External Catalog 中的 Database 和 Table 都是只读的。但是可以删除 Catalog(Internal Catalog无法删除)。可以通过 DROP CATALOG 命令删除一个 External Catalog。

    该操作仅会删除 Doris 中该 Catalog 的映射信息,并不会修改或变更任何外部数据目录的内容。

连接示例​

连接 Hive​

这里我们通过连接一个 Hive 集群说明如何使用 Catalog 功能。

更多关于 Hive 的说明,请参阅:Hive Catalog

  1. 创建 Catalog

    CREATE CATALOG hive PROPERTIES ('type'='hms','hive.metastore.uris' = 'thrift://172.21.0.1:7004'
    );
    

    CREATE CATALOG 语法帮助

  2. 查看 Catalog

    创建后,可以通过 SHOW CATALOGS 命令查看 catalog:

    mysql> SHOW CATALOGS;
    +-----------+-------------+----------+
    | CatalogId | CatalogName | Type     |
    +-----------+-------------+----------+
    |     10024 | hive        | hms      |
    |         0 | internal    | internal |
    +-----------+-------------+----------+
    

    SHOW CATALOGS 语法帮助

    可以通过 SHOW CREATE CATALOG 查看创建 Catalog 的语句。

    可以通过 ALTER CATALOG 修改 Catalog 的属性。

  3. 切换 Catalog

    通过 SWITCH 命令切换到 hive catalog,并查看其中的数据库:

    mysql> SWITCH hive;
    Query OK, 0 rows affected (0.00 sec)mysql> SHOW DATABASES;
    +-----------+
    | Database  |
    +-----------+
    | default   |
    | random    |
    | ssb100    |
    | tpch1     |
    | tpch100   |
    | tpch1_orc |
    +-----------+
    

    SWITCH 语法帮助

  4. 使用 Catalog

    切换到 Catalog 后,则可以正常使用内部数据源的功能。

    如切换到 tpch100 数据库,并查看其中的表:

    mysql> USE tpch100;
    Database changedmysql> SHOW TABLES;
    +-------------------+
    | Tables_in_tpch100 |
    +-------------------+
    | customer          |
    | lineitem          |
    | nation            |
    | orders            |
    | part              |
    | partsupp          |
    | region            |
    | supplier          |
    +-------------------+
    

    查看 lineitem 表的schema:

    mysql> DESC lineitem;
    +-----------------+---------------+------+------+---------+-------+
    | Field           | Type          | Null | Key  | Default | Extra |
    +-----------------+---------------+------+------+---------+-------+
    | l_shipdate      | DATE          | Yes  | true | NULL    |       |
    | l_orderkey      | BIGINT        | Yes  | true | NULL    |       |
    | l_linenumber    | INT           | Yes  | true | NULL    |       |
    | l_partkey       | INT           | Yes  | true | NULL    |       |
    | l_suppkey       | INT           | Yes  | true | NULL    |       |
    | l_quantity      | DECIMAL(15,2) | Yes  | true | NULL    |       |
    | l_extendedprice | DECIMAL(15,2) | Yes  | true | NULL    |       |
    | l_discount      | DECIMAL(15,2) | Yes  | true | NULL    |       |
    | l_tax           | DECIMAL(15,2) | Yes  | true | NULL    |       |
    | l_returnflag    | TEXT          | Yes  | true | NULL    |       |
    | l_linestatus    | TEXT          | Yes  | true | NULL    |       |
    | l_commitdate    | DATE          | Yes  | true | NULL    |       |
    | l_receiptdate   | DATE          | Yes  | true | NULL    |       |
    | l_shipinstruct  | TEXT          | Yes  | true | NULL    |       |
    | l_shipmode      | TEXT          | Yes  | true | NULL    |       |
    | l_comment       | TEXT          | Yes  | true | NULL    |       |
    +-----------------+---------------+------+------+---------+-------+
    

    查询示例:

    mysql> SELECT l_shipdate, l_orderkey, l_partkey FROM lineitem limit 10;
    +------------+------------+-----------+
    | l_shipdate | l_orderkey | l_partkey |
    +------------+------------+-----------+
    | 1998-01-21 |   66374304 |    270146 |
    | 1997-11-17 |   66374304 |    340557 |
    | 1997-06-17 |   66374400 |   6839498 |
    | 1997-08-21 |   66374400 |  11436870 |
    | 1997-08-07 |   66374400 |  19473325 |
    | 1997-06-16 |   66374400 |   8157699 |
    | 1998-09-21 |   66374496 |  19892278 |
    | 1998-08-07 |   66374496 |   9509408 |
    | 1998-10-27 |   66374496 |   4608731 |
    | 1998-07-14 |   66374592 |  13555929 |
    +------------+------------+-----------+
    

    也可以和其他数据目录中的表进行关联查询:

    mysql> SELECT l.l_shipdate FROM hive.tpch100.lineitem l WHERE l.l_partkey IN (SELECT p_partkey FROM internal.db1.part) LIMIT 10;
    +------------+
    | l_shipdate |
    +------------+
    | 1993-02-16 |
    | 1995-06-26 |
    | 1995-08-19 |
    | 1992-07-23 |
    | 1998-05-23 |
    | 1997-07-12 |
    | 1994-03-06 |
    | 1996-02-07 |
    | 1997-06-01 |
    | 1996-08-23 |
    +------------+
    

    这里我们通过 catalog.database.table 这种全限定的方式标识一张表,如:internal.db1.part

    其中 catalog 和 database 可以省略,缺省使用当前 SWITCH 和 USE 后切换的 catalog 和 database。

    可以通过 INSERT INTO 命令,将 hive catalog 中的表数据,插入到 interal catalog 中的内部表,从而达到导入外部数据目录数据的效果:

    mysql> SWITCH internal;
    Query OK, 0 rows affected (0.00 sec)mysql> USE db1;
    Database changedmysql> INSERT INTO part SELECT * FROM hive.tpch100.part limit 1000;
    Query OK, 1000 rows affected (0.28 sec)
    {'label':'insert_212f67420c6444d5_9bfc184bf2e7edb8', 'status':'VISIBLE', 'txnId':'4'}
    

列类型映射​

用户创建 Catalog 后,Doris 会自动同步数据目录的数据库和表,针对不同的数据目录和数据表格式,Doris 会进行以下列映射关系。

对于当前无法映射到 Doris 列类型的外表类型,如 UNIONINTERVAL 等。Doris 会将列类型映射为 UNSUPPORTED 类型。对于 UNSUPPORTED 类型的查询,示例如下:

假设同步后的表 schema 为:

k1 INT,
k2 INT,
k3 UNSUPPORTED,
k4 INT

select * from table;                // Error: Unsupported type 'UNSUPPORTED_TYPE' in '`k3`
select * except(k3) from table;     // Query OK.
select k1, k3 from table;           // Error: Unsupported type 'UNSUPPORTED_TYPE' in '`k3`
select k1, k4 from table;           // Query OK.

不同的数据源的列映射规则,请参阅不同数据源的文档。

权限管理​

使用 Doris 对 External Catalog 中库表进行访问时,默认情况下,依赖 Doris 自身的权限访问管理功能。

Doris 的权限管理功能提供了对 Catalog 层级的扩展,具体可参阅 权限管理 文档。

用户也可以通过 access_controller.class 属性指定自定义的鉴权类。如通过指定:

"access_controller.class" = "org.apache.doris.catalog.authorizer.RangerHiveAccessControllerFactory"

则可以使用 Apache Range 对 Hive Catalog 进行鉴权管理。详细信息请参阅:Hive Catalog

指定需要同步的数据库​

通过在 Catalog 配置中设置 include_database_list 和 exclude_database_list 可以指定需要同步的数据库。

include_database_list: 支持只同步指定的多个database,以 , 分隔。默认同步所有database。db名称是大小写敏感的。

exclude_database_list: 支持指定不需要同步的多个database,以 , 分割。默认不做任何过滤,同步所有database。db名称是大小写敏感的。

当 include_database_list 和 exclude_database_list 有重合的database配置时,exclude_database_list会优先生效。

连接 JDBC 时,上述 2 个配置需要和配置 only_specified_database 搭配使用,详见 JDBC

元数据更新​

手动刷新​

默认情况下,外部数据源的元数据变动,如创建、删除表,加减列等操作,不会同步给 Doris。

用户需要通过 REFRESH CATALOG 命令手动刷新元数据。

自动刷新​

Hive Metastore​

自动刷新目前仅支持 Hive Metastore 元数据服务。通过让 FE 节点定时读取 HMS 的 notification event 来感知 Hive 表元数据的变更情况,目前支持处理如下event:

事件事件行为和对应的动作
CREATE DATABASE在对应数据目录下创建数据库。
DROP DATABASE在对应数据目录下删除数据库。
ALTER DATABASE此事件的影响主要有更改数据库的属性信息,注释及默认存储位置等,这些改变不影响doris对外部数据目录的查询操作,因此目前会忽略此event。
CREATE TABLE在对应数据库下创建表。
DROP TABLE在对应数据库下删除表,并失效表的缓存。
ALTER TABLE如果是重命名,先删除旧名字的表,再用新名字创建表,否则失效该表的缓存。
ADD PARTITION在对应表缓存的分区列表里添加分区。
DROP PARTITION在对应表缓存的分区列表里删除分区,并失效该分区的缓存。
ALTER PARTITION如果是重命名,先删除旧名字的分区,再用新名字创建分区,否则失效该分区的缓存。

当导入数据导致文件变更,分区表会走ALTER PARTITION event逻辑,不分区表会走ALTER TABLE event逻辑。

如果绕过HMS直接操作文件系统的话,HMS不会生成对应事件,doris因此也无法感知

该特性在 fe.conf 中有如下参数:

  1. enable_hms_events_incremental_sync: 是否开启元数据自动增量同步功能,默认关闭。
  2. hms_events_polling_interval_ms: 读取 event 的间隔时间,默认值为 10000,单位:毫秒。
  3. hms_events_batch_size_per_rpc: 每次读取 event 的最大数量,默认值为 500。

如果想使用该特性(华为MRS除外),需要更改HMS的 hive-site.xml 并重启HMS和HiveServer2:

<property><name>hive.metastore.event.db.notification.api.auth</name><value>false</value>
</property>
<property><name>hive.metastore.dml.events</name><value>true</value>
</property>
<property><name>hive.metastore.transactional.event.listeners</name><value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>

华为的MRS需要更改hivemetastore-site.xml 并重启HMS和HiveServer2:

<property><name>metastore.transactional.event.listeners</name><value>org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>

注意:value是在原有值的基础上以逗号分隔追加,而不是覆盖。例如MRS 3.1.0默认配置为

<property><name>metastore.transactional.event.listeners</name><value>com.huawei.bigdata.hive.listener.TableKeyFileManagerListener,org.apache.hadoop.hive.metastore.listener.FileAclListener</value>
</property>

我们需要改为

<property><name>metastore.transactional.event.listeners</name><value>com.huawei.bigdata.hive.listener.TableKeyFileManagerListener,org.apache.hadoop.hive.metastore.listener.FileAclListener,org.apache.hive.hcatalog.listener.DbNotificationListener</value>
</property>

使用建议: 无论是之前已经创建好的catalog现在想改为自动刷新,还是新创建的 catalog,都只需要把 enable_hms_events_incremental_sync 设置为true,重启fe节点,无需重启之前或之后再手动刷新元数据。

定时刷新​

在创建catalog时,在properties 中指定刷新时间参数metadata_refresh_interval_sec ,以秒为单位,若在创建catalog时设置了该参数,FE 的master节点会根据参数值定时刷新该catalog。目前支持三种类型

  • hms:Hive MetaStore
  • es:Elasticsearch
  • jdbc:数据库访问的标准接口(JDBC)
Example​
-- 设置catalog刷新间隔为20秒
CREATE CATALOG es PROPERTIES ("type"="es","hosts"="http://127.0.0.1:9200","metadata_refresh_interval_sec"="20"
);

相关文章:

Apache Doris 入门教程35:多源数据目录

概述 多源数据目录&#xff08;Multi-Catalog&#xff09;功能&#xff0c;旨在能够更方便对接外部数据目录&#xff0c;以增强Doris的数据湖分析和联邦数据查询能力。 在之前的 Doris 版本中&#xff0c;用户数据只有两个层级&#xff1a;Database 和 Table。当我们需要连接…...

响应式web-PC端web与移动端web(H5)兼容适配 选型方案

背景 项目需要&#xff0c;公司已经有一套PC端web&#xff0c;需要做一套手机端浏览器可用的&#xff0c;但是又想兼容pc端&#xff0c;适配的web项目。 以下是查阅到响应布局现成的开源模版。根据自己技术栈&#xff0c;vue2,js来搜索相关的开源项目。 RuoYi 使用若依快速…...

Redis持久化之RDB解读

目录 什么是RDB 配置位置参数解读 如何使用 自动触发 手动触发 save bgsave RDBRDB持久化文件的恢复 正常恢复 恢复失败处理方法 RDB优势 RDB 缺点 redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘…...

四维图新 minemap实现地图漫游效果

原理就是不断改变地图中心点&#xff0c;改变相机角度方向&#xff0c;明白这一点&#xff0c;其他地图引擎譬如cesium都可效仿&#xff0c;本人就是通过cesium的漫游实现四维图新的漫游&#xff0c;唯一不足的是转弯的时候不能丝滑转向&#xff0c;尝试过应该是四维图新引擎的…...

centos7安装MySQL8

Centos7安装MySQL8 MySQL版本&#xff1a;8.0.34 1.安装前准备 &#xff08;1&#xff09;查看是否安装mariadb [rootkb135 ~]# rpm -qa|grep mariadb &#xff08;2&#xff09;卸载mariadb并检查是否卸干净 [rootkb135 ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x8…...

【IMX6ULL驱动开发学习】10.Linux I2C驱动实战:AT24C02驱动设计流程

前情回顾&#xff1a;【IMX6ULL驱动开发学习】09.Linux之I2C框架简介和驱动程序模板_阿龙还在写代码的博客-CSDN博客 目录 一、修改设备树&#xff08;设备树用来指定引脚资源&#xff09; 二、编写驱动 2.1 i2c_drv_read 2.2 i2c_drv_write 2.3 完整驱动程序 三、上机测…...

【C++】详解声明和定义

2023年8月28日&#xff0c;周一下午 研究了一个下午才彻底弄明白... 写到晚上才写完这篇博客。 目录 声明和定义的根本区别结构体的声明和定义声明结构体 定义结构体类的声明和定义函数的定义和声明声明函数 定义函数变量声明和定义声明变量定义变量 声明和定义的根本区别 …...

掌握C/C++协程编程,轻松驾驭并发编程世界

一、引言 协程的定义和背景 协程&#xff08;Coroutine&#xff09;&#xff0c;又称为微线程或者轻量级线程&#xff0c;是一种用户态的、可在单个线程中并发执行的程序组件。协程可以看作是一个更轻量级的线程&#xff0c;由程序员主动控制调度。它们拥有自己的寄存器上下文…...

MyBatis-Plus的分页配置类

文章目录 package com.itheima.reggie.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; imp…...

排序算法-选择排序(Java)

选择排序 选择排序 &#xff08;selection sort&#xff09;的工作原理非常直接&#xff1a;开启一个循环&#xff0c;每轮从未排序区间选择最小的元素&#xff0c;将其放到已排序区间的末尾。 算法原理 排序数组&#xff1a;&#xff08;2 4 3 1 5 2&#xff09; &#xf…...

SpringBoot 怎么返回html界面

方法一&#xff1a; &#xff08;1&#xff09;html文件要放在resource下的static目录下&#xff08;没有static 自己就创建一个文件夹&#xff09; &#xff08;2&#xff09;在application.yml 中配置视图解析器 spring:mvc:view:prefix: /suffix: .html &#xff08;3&a…...

watch computed 和 method

在Vue中&#xff0c;watch computed 和 method有啥区别&#xff0c;有啥作用&#xff0c;适用于何种情景并代码举例 在Vue中&#xff0c;watch、computed和methods是三种不同的属性&#xff0c;用于处理不同的场景和需求。 watch&#xff1a;watch用于监听数据的变化并执行相…...

数据结构,线性表有哪些

线性表是一种常见的数据结构&#xff0c;它的特点是数据元素之间存在一对一的线性关系。根据线性表的存储方式和实现方式&#xff0c;线性表主要有以下几种&#xff1a; 1. 顺序表&#xff08;Sequential List&#xff09;: - 通常使用数组实现。 - 元素在内存中是连续…...

服务间通过Feign相互调用报错,参数是MultiparFile、参数是POJO报错

目录 1.Feign传文件报错,Feign不支持上传文件需要借助外面的依赖才可以实现上传 2.服务之间通过Feign相互调用传递DTO(实体对象)报错 1.Feign传文件报错,Feign不支持上传文件需要借助外面的依赖才可以实现上传 具体报错内容: FileUploadException: the request was reje…...

Flutter系列文章-Flutter应用优化

当涉及到优化 Flutter 应用时&#xff0c;考虑性能、UI 渲染和内存管理是至关重要的。在本篇文章中&#xff0c;我们将通过实例深入讨论这些主题&#xff0c;展示如何通过优化技巧改进你的 Flutter 应用。 代码性能优化 1. 使用 const 构造函数 在构建小部件时&#xff0c;尽…...

opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

1.二维码的生成 废话不多说&#xff0c;直接上代码 # 生成二维码 import qrcode# 二维码包含的示例数据 data "B0018" # 生成的二维码图片名称 filename "qrcode.png" # 生成二维码 img qrcode.make(data) # 保存成图片输出 img.save(filename)img.sh…...

叠螺式污泥脱水机的要点及价格分析

诸城市鑫淼环保小编带大家了解一下叠螺式污泥脱水机的要点及价格分析 设备工作步骤 叠螺脱水机在工作时分为3个步骤&#xff0c;分别是稀释、脱水、自洗濯&#xff1a; 1、稀释&#xff1a;当螺旋推进轴迁移转变时&#xff0c;设在推进轴核心的多重固活叠片挪动&#xff0c;在重…...

Visual Studio中Linux开发头文件intellisense问题的解决办法

文章目录 前言个人环境 SSH到WSL复制文件后记 前言 最近在用我心爱的Visual Studio配合WSL2做一些Linux开发&#xff0c;但是有一个问题&#xff0c;就是当我#include <sys/socket.h>&#xff0c;会提示找不到文件 我尝试了各种姿势&#xff0c;包括修改CMakeSettings.…...

如何以CPU方式启动Stable Diffusion WebUI?

默认情况下Stable Diffusion WebUI采用GPU模式运行&#xff0c;但是稍微运行起来就知道至少需要4G的显存&#xff0c;2G显存虽然能够通过带--lowvram运行起来&#xff0c;但是能够炼出来的图基本都是512x512的&#xff0c;不能够炼大图&#xff0c;如果你刚好和我一样家境贫寒&…...

HTTP 框架修炼之道 | 青训营

Powered by:NEFU AB-IN 文章目录 HTTP 框架修炼之道 | 青训营 走进 HTTP 协议HTTP 框架的设计与实现应用层中间件层路由设计协议层 传输层&#xff08;网络层&#xff09;1. BIO&#xff08;Blocking I/O&#xff09;:2. NIO&#xff08;Non-blocking I/O&#xff09;:区别&…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)

注&#xff1a;文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件&#xff1a;STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...

VSCode 使用CMake 构建 Qt 5 窗口程序

首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...

计算机系统结构复习-名词解释2

1.定向&#xff1a;在某条指令产生计算结果之前&#xff0c;其他指令并不真正立即需要该计算结果&#xff0c;如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方&#xff0c;那么就可以避免停顿。 2.多级存储层次&#xff1a;由若干个采用不同实现技术的存储…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除

目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作&#xf…...

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...

STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)

文章目录 PWRPWR&#xff08;电源控制模块&#xff09;核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤&#xff1a;宏定义配置三、程序流程&#xff1a;时钟配置函数解析四、注意…...