Oracle架构之段管理和区管理
文章目录
- 1 段
- 1.1 简介
- 1.1.1 定义
- 1.1.2 分类
- 1.2 段空间的管理模式
- 1.2.1 手工段空间管理(Manual Segment Space Management)
- 1.2.2 自动段空间管理(Auto Segment Space Management)
- 1.3 段空间的手工管理(Manual Segment Space Management)
- 1.3.1 查看空闲列表
- 1.3.2 手工指定空闲列表的数量
- 1.4 段空间自动管理(Auto Segment Space Management)
- 1.4.1 查看位图块和段头块
- 2 区
- 2.1 简介
- 2.1.1 定义
- 2.1.2 查看 extent 的信息
- 2.2 创建 extent
- 2.2.1 自动创建 extent
- 2.2.2 建表时手工指定 extent 大小
- 2.3 扩展与回收
- 2.3.1 扩展 extent
- 2.3.2 手工回收 extent
- 2.3.3 删除数据后回收 extent
- 2.3.4 执行 truncate 和 drop 命令收缩 extent
- 2.4 extent 空间分配算法
1 段
1.1 简介
1.1.1 定义
段是由一个或多个数据区构成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象, Oracle 也把这种占用空间的数据对象统一称为段。
当一个段被创建时,区间(Extent
)就被分配,随着后续的不断使用,一个段的空间可以以区为单位不断扩展。
一个段只属于一个特定的数据对象
,每当创建一个具有独立段的数据对象时, Oracle
将为它创建一个段。段是为特定的数据对象(如表、索引、回滚等)分配的一系列数据区。
段是逻辑结构中更高层次的组织单位,用于存储和管理数据
。一个表或索引在磁盘上对应一个或多个段。
一个段只能存放在一个表空间中,但是可分布在属于这个表空间中的多个数据文件中。段内包含的数据区可以不连续,并且可以跨越多个文件,使用段的目的是用来保存特定对象。
1.1.2 分类
可以使用数据字段 dba_segments
查看 Oracle 段的类型:
SQL> select distinct segment_type from dba_segments;
一个 Oracle 数据库通常有以下 几种类型的段:
数据段
:也称为表段
,数据段中保存的是表中的数据记录。在创建数据表时, Oracle 系统将为表创建数据段。当表中的数据量增大时,数据段的大小自然也随着变大,数据段的增大过程是通过向其添加新的数据区来实现的。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。
查询users 表空间中,所有表的名称、大小
SQL> select OWNER, SEGMENT_NAME, BYTES/1024/1024 size_MBfrom dba_segmentswhere segment_type='TABLE' and tablespace_name='USERS';
索引段
:索引段中包含了用于提高系统性能的索引信息。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。
查询users 表空间中,所有索引的名称、大小:
SQL> select OWNER, SEGMENT_NAME, BYTES/1024/1024 size_MBfrom dba_segmentswhere segment_type='INDEX' and tablespace_name='USERS';
回滚段
:回滚段(也可称作撤销段)中保存了回滚条目, Oracle 将修改前的旧值保存在回滚条目中。利用这些信息,可以撤销未提交的操作,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。
当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。
回退段包含两种类型:(1)ROLLBAKTY;(2)PE2 UNDO
查看回退段的信息:
SQL> select owner,segment_name,tablespace_name from dba_segments where segment_type='ROLLBACK';
SQL> select owner,segment_name,tablespace_name from dba_segments where segment_type='TYPE2 UNDO';也可通过数据字典 dba_rollback_segs 查看回退段的信息:
SQL> select owner,segment_name,tablespace_name,status from dba_rollback_segs;
临时段
:当执行创建索引、查询等操作时, Oracle 可能会使用一些临时存储空间,用于暂时性地保存解析过的查询语句以及在排序过程中产生的临时数据。 Oracle 系统将在专门用于存储临时数据的表空间中为操作分配临时段。一旦语句执行完毕,临时段将自动消除。
在执行“CREATE INDEX”、“SELECT ORDER BY”、“SELECT DISTINCT”和“SELECT GROUPBY”等几种类型的 SQL 语句时, Oracle 系统就会在临时表空间中为这些语句的操作分配一个临时段。
在数据库管理过程中,若经常需要执行上面这类 SQL 语句,最好调整 SORT_AREA_SIZE 初始化参数来增大排序区,从而使排序操作尽量在内存中完成,以获得更好的执行效率,但同时这对数据库服务器的内存空间提出了更大的要求。LOB 段
:如果表中含有 CLOB 和 BLOB 等大型对象类型数据时,系统将创建 LOB 段以存储相应的大型对象数据。
1.2 段空间的管理模式
段空间管理模式,就是怎样管理段内的空闲空间,是指如何管理段所拥有的数据块中的空闲块。段空间管理模式分为两种:自动管理(auto)
和手工管理(manual)
段空间管理模式是表空间的一个属性。即:某个表空间中的所有段必须采用同一种管理模式。
查看段空间的管理模式:
SQL> select tablespace_name, segment_space_management from dba_tablespaces;
1.2.1 手工段空间管理(Manual Segment Space Management)
MSSM
管理方式是 Oracle 最初实现的一种段空间管理技术。区间(Extent
)是 Oracle
的最小空间分配单元,而 Block
是Oracle
的最小 IO 操作单元,也就是说,Oracle
以区间为单位将空间分配给段,而段内则是以 Block
为单位进行空间使用和管理的。
MSSM
管理方式的具体实现方式是通过在段头(Segment Header
)分配空闲列表(freelist
)来管理 Block 的使用,可以把自由列表想象成一个数据表,Oracle 依赖一系列的算法通过向自由列表中加入或移出 Block 来实现段空间管理。
1.2.2 自动段空间管理(Auto Segment Space Management)
在ASSM
中,原有的 freelist
被位图所取代,通过位图能够迅速有效地管理存储扩展和剩余区块(free block
),因此能够改善段存储管理的本质。
1.3 段空间的手工管理(Manual Segment Space Management)
MSSM
管理方式的具体实现方式是通过在段头(Segment Header
)分配空闲列表(freelist
)来管理 Block
的使用。使用空闲列表管理段内的空闲块,空闲列表记录在段头,空闲列表指向段内空闲块的地址,空闲列表的数量可以由用户指定。可以把自由列表想象成一个数据表,Oracle 依赖一系列的算法通过向空闲列表中加入或移出 Block 来实现段空间管理。
当创建对象时(如数据表)可以定义 freelist
的数量,对于数据表缺省的 freelist 为1,可以通过 dba_segments 查询得到这些数据:
SQL> select owner,segment_name,freelists from dba_segments where owner='SCOTT';
当向一个对象中插入数据时,Oracle
首先在该对象的 freelist
上寻找可用于插入数据的 Block,当一个 Block 用完之后,就会从 freelist
中删除,当这个 Block 上由于数据删除等空间释放后,可以再次回到 freelist
中,而这主要是通过存储参数 PCTFREE
和 PCTUSED
来实现。
假设PCTFREE=20,PCTUSED=40,表明当一个 Block 的空间使用率达到了 80% 时,这个 block 就不再允许被用于新增数据(insert
),而保留下来的这 20% 的空间则被预留为行更新(update
)所可能需要的空间扩展,此时这个 Block 就从 freelist 中被删除;当这个 Block
中有数据被删除(delete)时,空间不断被释放,当空间使用低于 PCTUSED
参数设置时(此处即为40%),这个数据块才会重新被加入到 freelists
中,加入 freelist
后这个 Block 又可以被插入新的数据。
通过以上的描述可以看出,如果一个段的操作非常频繁,那么很多用户就会同时请求访问 freelist
,并对 freelist
进行修改。对于表来说,缺省的 freelist 为1,这就很容易引发竞争,虽然可以通过增加 freelist
的方法缓解这种竞争,但是我们已经看到这种管理方式存在的缺陷。
可以通过 DUMP 的方式来转储数据块的头信息,查看 freelist 的设置。
1.3.1 查看空闲列表
在 system 表空间(手工管理)创建一张表 scott.tx001
-- system 表空间采用手工管理段空间
SQL> create table scott.tx001(id int, name varchar(20)) tablespace system;--在表中插入数据
SQL> insert into scott.tx001 values(1,'Jack');SQL> commit;SQL> alter system checkpoint;
查询 tx001 段的段头块
--查询哪些块属于 tx001 段
SQL> select file_id, block_id, blocks from dba_extents where segment_name = 'TX001';--查询 tx001 段的段头块
SQL> select header_file, header_block from dba_segments where segment_name = 'TX001';
将段头块(segment header)的数据转储到用户进程跟踪文件
SQL> alter system dump datafile 1 block 95392;--查看用户进程跟踪文件的位置
SQL> show parameter background
查看用户进程跟踪文件的内容
按时间先后显示用户进程跟踪文件
[root@rac1 trace]# ll -tr *ora*
.....
-rw-r----- 1 oracle asmadmin 386 8月 23 12:33 orcl1_ora_2750.trm
-rw-r----- 1 oracle asmadmin 3640 8月 23 12:33 orcl1_ora_2750.trc
-rw-r----- 1 oracle asmadmin 159 8月 23 12:46 orcl1_ora_4274.trm
-rw-r----- 1 oracle asmadmin 3180 8月 23 12:46 orcl1_ora_4274.trc
查看用户进程跟踪文件的内容
[root@rac1 trace]# cat orcl1_ora_4274.trc*** 2021-08-23 12:46:51.013
Dump of buffer cache at level 4 for tsn=0 rdba=4289696
Block dump from disk:
buffer tsn: 0 rdba: 0x004174a0 (1/95392)
scn: 0x0000.002bb0a4 seq: 0x01 flg: 0x04 tail: 0xb0a41001
#########################################
## DATA SEGMENT HEADER:段头块
frmt: 0x02 chkval: 0xc5e5 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
#########################################
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F6954A3FA00 to 0x00007F6954A41A00
7F6954A3FA00 0000A210 004174A0 002BB0A4 04010000 [.....tA...+.....]
......
7F6954A419F0 00000000 00000000 00000000 B0A41001 [................]Extent Control Header-----------------------------------------------------------------Extent Header:: spare1: 0 spare2: 0 extents: 1 blocks: 7 last map 0x00000000 maps: 0 offset: 4128
############ 高水位标记##########################
## 指向段内的第一个空闲块的地址,即:当前段的第一个空闲块的地址为 0x004174a2
## 查询时如果执行全表扫描,则扫描到高水位标记指向的块就结束。并不需要扫描所有的块。
## 因为高水位之后的块肯定是空白块,不需要扫描。Highwater:: 0x004174a2 ext#: 0 blk#: 1 ext size: 7 blocks in seg. hdr's freelists: 1 blocks below: 1
##############################################mapblk 0x00000000 offset: 0 UnlockedMap Header:: next 0x00000000 extents: 1 obj#: 87834 flag: 0x40000000Extent Map-----------------------------------------------------------------0x004174a1 length: 7 nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 1
##############################################
## 空闲列表:指向高水位之前的某个空闲块SEG LST:: flg: USED lhd: 0x004174a1 ltl: 0x004174a1
##############################################
2021-08-23 12:46:51.087256 : kjbmbassert [0x174a0.1]
End dump data blocks tsn: 0 file#: 1 minblk 95392 maxblk 95392
1.3.2 手工指定空闲列表的数量
指定空闲列表的数量为 2
SQL> alter table scott.tx001 storage (freelists 2);
重新转储段头块
SQL> alter system dump datafile 1 block 95392;
查看用户进程跟踪文件的内容
##按时间先后显示用户进程跟踪文件
[root@rac1 trace]# ll -tr *ora*
.....
-rw-r----- 1 oracle asmadmin 43502 8月 23 14:10 orcl1_ora_9867.trc
-rw-r----- 1 oracle asmadmin 2744 8月 23 14:27 orcl1_ora_14686.trm
-rw-r----- 1 oracle asmadmin 38041 8月 23 14:27 orcl1_ora_14686.trc
-rw-r----- 1 oracle asmadmin 568 8月 24 01:46 orcl1_ora_87048.trm
-rw-r----- 1 oracle asmadmin 5924 8月 24 01:46 orcl1_ora_87048.trc##查看用户进程跟踪文件的内容
[root@rac1 trace]# cat orcl1_ora_87048.trc*** 2021-08-24 01:46:33.285
Block dump from disk:
buffer tsn: 0 rdba: 0x004174a0 (1/95392)
scn: 0x0000.002c7a26 seq: 0x01 flg: 0x04 tail: 0x7a261001
frmt: 0x02 chkval: 0xc5e1 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F4429EE2A00 to 0x00007F4429EE4A00
7F4429EE2A00 0000A210 004174A0 002C7A26 04010000 [.....tA.&z,.....]
......
7F4429EE49F0 00000000 00000000 00000000 7A261001 [..............&z]Extent Control Header-----------------------------------------------------------------Extent Header:: spare1: 0 spare2: 0 extents: 1 blocks: 7 last map 0x00000000 maps: 0 offset: 4128 Highwater:: 0x004174a2 ext#: 0 blk#: 1 ext size: 7 blocks in seg. hdr's freelists: 1 blocks below: 1 mapblk 0x00000000 offset: 0 UnlockedMap Header:: next 0x00000000 extents: 1 obj#: 87834 flag: 0x40000000Extent Map-----------------------------------------------------------------0x004174a1 length: 7 nfl = 2, nfb = 1 typ = 1 nxf = 0 ccnt = 1
#############################################
## 空闲列表:一共 3 个空闲列表SEG LST:: flg: USED lhd: 0x004174a1 ltl: 0x004174a1 SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
#############################################
GLOBAL CACHE ELEMENT DUMP (address: 0x77bf3be8):
...2021-08-24 01:46:33.462741 : kjbmbassert [0x174a0.1]
End dump data blocks tsn: 0 file#: 1 minblk 95392 maxblk 95392
1.4 段空间自动管理(Auto Segment Space Management)
在ASSM
管理方式下,原有的 freelist
被位图所取代,通过位图能够迅速有效地管理存储扩展和剩余区块(free block
),因此能够改善段存储管理的本质。在 ASSM
管理方式下,insert
通过扫描位图来查找可用的 block
,即使 block
的可用空间低于 PCTFREE
,也不会从位图中删除,因此 PCTUSED
参数将不再需要;而 PCTFREE
参数,仍然需要它来指示需要保留多少空间给后续的 update 导致的行数据增长使用。至于 freelists 和 freelist groups
参数在 ASSM
中都无效了。
创建一个数据表,设置 pctfree 选项,命令如下:
create table EYGLE ( ID NUMBER(8), UNAME CHAR(1000)
) tablespace ts001pctfree 50;
新的管理机制用位图数组来跟踪或管理每个分配到对象的块,而每个块有多少剩余空间是根据位图的状态来确定的。Oracle
将高水位(HIgh Water Mark)以下的块分成六种状态:full、UNformat、free 0~25%、free 25~50%、、free 50~75%、free 75~100%
。块的空间使用情况会记录在位图块,位图块属于具体的段。
段空间自动管理模式下:由 FIRST LEVEL BITMAP BLOCK
(一级位图块)管理空闲块。由 SECOND LEVEL BITMAP BLOCK
(二级位图块)管理一级位图块。当数据量足够大时,还会出现 THIRD BITMAP BLOCK
(三级位图块),由三级位图块管理二级位图块。
使用 ASSM
管理方式之后,显著提高了 DML
并发操作的性能,因为位图数组的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。
1.4.1 查看位图块和段头块
在 ts001 表空间(自动管理)创建一张表 scott.tx002
select tablespace_name,contents,segment_space_management from dba_tablespaces;ts001 表空间采用手工管理段空间
SQL> create table scott.tx002(id int, name varchar(20)) tablespace ts001;在表中插入数据
SQL> insert into scott.tx002 values(1,'Jack');
SQL> commit;SQL> alter system checkpoint;查询哪些块属于 tx002 段
SQL> select file_id, block_id, blocks from dba_extents where 段头块并不是第一个数据块
SQL> select header_file, header_block from dba_segments where segment_name = 'TX002';将 128~135 共 8 个块的数据转储到用户进程跟踪文件
Alter system dump datafile 6 block min 128 block max 135;
2 区
2.1 简介
2.1.1 定义
数据区
(也可称作数据扩展区
)是由一组连续的 Oracle
数据块所构成的 Oracle
存储结构,一个或多个数据块组成一个数据区,一个或多个数据区再组成一个段(Segment
)。用于保存特定数据类型的数据,区不可跨越多个数据文件。
当用户创建表时,Oracle
为此表的数据段分配一个包含若干数据块的初始区(initial extent
)。当一个段中的所有空间被使用完后, Oracle
系统将自动为该段分配一个新的数据区,这也正符合Extent
这个单词所具有的”扩展”的含义,说明 数据区是 Oracle
存储分配的最小单位, Oracle
就以数据区为单位进行存储控件的扩展。如果一个盘区不足以容纳一个逻辑块,则会分配多个相邻的盘区。当段中的数据被删除或移动时,相应的盘区会被释放出来供其他对象使用。
使用数据区的目的是用来保存特定数据类型的数据。 数据区是表中数据增长的基本单位, 在 Oracle
数据库中,分配存储空间就是以数据区为单位的。一个 Oracle
对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。
在Oracle
数据库中,盘区的大小取决于段的大小、空间使用情况以及数据库的配置参数。
段的定义中包含了区(extent
)的存储参数,存储参数适用于各种类型的段。该参数控制 Oracle 如何为段分配可用空间。如:在 CREATE TABLE
语句中使用 STORAGE
子句设定存储参数,决定创建表时为段分配多少初始空间,或限定一个表最多可以包含多少区。如果没有指定存储参数,创建表时使用所在表空间的默认存储参数。
创建一张空表时是否分配 extent
与 deferred_segment_creation
参数有关:
SQL> show parameter deferred
说明:deferred_segment_creation 参数
为 false 时:创建表的时候分配 extent
为 trude 时:创建表的时候不分配空间,执行 insert 操作时分配空间
2.1.2 查看 extent 的信息
创建一张表 scott.emp002
SQL> create table scott.emp002 as select * from scott.emp where 1=2;使用数据字典 dba_extents 查看 extent 的使用情况查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';可以看到,系统并没有为表 scott.emp002 分配空间。原因就是 deferred_segment_creation 参数为 true 时,并不为空表分配存储空间。向 scott.emp002 表插入数据
SQL> insert into scott.emp002(empno, ename, sal) values(8888,'TOM',2800);
SQL> commit;重新查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';
2.2 创建 extent
2.2.1 自动创建 extent
当用户创建表时(创建一张空表时是否分配 extent
与 deferred_segment_creation
参数有关),Oracle 为此表的数据段分配一个包含若干数据块的初始区(initial extent
)。
当一个段的初始区中的数据块已满,并且有新数据插入时,Oracle 自动为这个段分配一个增量区(incremental extent
)。
为 scott.emp002 表插入数据
SQL> insert into scott.emp002 select * from scott.emp;SQL> insert into scott.emp002 select * from scott.emp002;查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';为 scott.emp002 表插入数据
SQL> insert into scott.emp002 select * from scott.emp002;
SQL> insert into scott.emp002 select * from scott.emp002;
SQL> commit;查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';-- extent 增加,并且,每个 extent 包含 8 个数据块为 scott.emp002 表插入数据
SQL> insert into scott.emp002 select * from scott.emp002;
3840 rows created.SQL> insert into scott.emp002 select * from scott.emp002;
7680 rows created.SQL> insert into scott.emp002 select * from scott.emp002;
15360 rows created.SQL> insert into scott.emp002 select * from scott.emp002;
30720 rows created.SQL> insert into scott.emp002 select * from scott.emp002;
61440 rows created.SQL> commit;查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';extent 数量继续增加,但后来每个 extent 包含 128 个数据块
2.2.2 建表时手工指定 extent 大小
创建表时可以指定 storage 参数指定段的大小:
创建表 scott.emp666,初始大小 10m
SQL> create table scott.emp666 storage(initial 10m) tablespace ts001 as select * from scott.emp;查看 scott.emp002 表对应的 extent 信息
SQL>
select file_id, block_id, blocks, extent_id
2.3 扩展与回收
2.3.1 扩展 extent
使用alter table 命令:
查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';手工扩展表 emp002 的 extent
SQL> alter table scott.emp002 allocate extent (size 2048k datafile '+DATA/orcl/datafile/users.259.1070471891');
2.3.2 手工回收 extent
手工回收 extent 只能回收完全没有使用的 extent。使用 alter table 命令:
SQL> alter table scott.emp002 deallocate unused;查看scott.emp002 表对应的 extent 信息:
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';
2.3.3 删除数据后回收 extent
注意
:删除数据后 extent
并不会自动回收
删除 scott.emp002 中的部分数据
SQL> delete from scott.emp002 where rownum < 55000;
SQL> commit;
SQL> select count(*) from scott.emp002;SQL> delete from scott.emp002 where rownum < 55000;
SQL> commit;查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';打开行移动
SQL> alter table scott.emp002 enable row movement;收缩表空间
SQL> alter table scott.emp002 shrink space;查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';
2.3.4 执行 truncate 和 drop 命令收缩 extent
执行 truncate 清空数据
执行 truncate 清空数据
SQL> truncate table scott.emp002;
Table truncated.查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';
执行 drop 命令删除表
SQL> drop table scott.emp002;查看 scott.emp002 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';
2.4 extent 空间分配算法
查看extent 空间分配算法:
SQL> select tablespace_name, allocation_type from dba_tablespaces;
system:extent 呈阶梯增长
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP002';
uniform:每次分配的 extent 大小相同
创建一个 uniform 类型的表空间
SQL> create tablespace ts003 datafile '+DATA/orcl/datafile/ts003.dbf' size 50m uniform size 10m;在表空间 ts003 中创建表 scott.emp888
SQL> create table scott.emp888 tablespace ts003as select * from scott.emp;查看 scott.emp888 表对应的 extent 信息
SQL> select file_id, block_id, blocks, extent_id from dba_extents where segment_name = 'EMP888';
相关文章:

Oracle架构之段管理和区管理
文章目录 1 段1.1 简介1.1.1 定义1.1.2 分类 1.2 段空间的管理模式1.2.1 手工段空间管理(Manual Segment Space Management)1.2.2 自动段空间管理(Auto Segment Space Management) 1.3 段空间的手工管理(Manual Segmen…...

mybatis-plus转换数据库json类型数据为java对象
JacksonTypeHandler JacksonTypeHandler 可以实现把json字符串转换为java对象。同一类型的handler有: Fastjson2TypeHandlerFastjsonTypeHandlerGsonTypeHandlerJacksonTypeHandler 至于需要哪一个选一个用就好了 使用方式 在实体类中加入注解 TableName(value "table_…...

Java | Leetcode Java题解之第467题环绕字符串中唯一的子字符串
题目: 题解: class Solution {public int findSubstringInWraproundString(String p) {int[] dp new int[26];int k 0;for (int i 0; i < p.length(); i) {if (i > 0 && (p.charAt(i) - p.charAt(i - 1) 26) % 26 1) { // 字符之差为…...

诺贝尔物理奖与化学奖彰显AI力量,探索智能新边界
在今年的诺贝尔物理学奖和化学奖的颁奖典礼上,人工智能(AI)再次成为耀眼的明星。两位物理学奖得主约翰J霍普菲尔德和杰弗里E辛顿因在人工神经网络和机器学习领域的开创性工作而获奖,而化学奖则颁给了在蛋白质结构设计和预测方面做…...

基于京东:HotKey实现自动缓存热点Key!!!
一.引言 某些热点数据,我们提前如果能够预判到的话,可以提前人工给数据加缓存,也就是缓存预热,将其缓存在本地或者Redis中,提高访问性能同时,减低数据库压力,也减轻后端服务的压力。但是&#…...

★ 算法OJ题 ★ 二分查找算法
Ciallo~(∠・ω< )⌒☆ ~ 今天,塞尔达将和大家一起做几道二分查找算法算法题 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页:椎名澄嵐-CSDN博客 算法专栏:★ 优选算法100天 ★_椎名澄嵐的博客-CSDN博客…...

RTSP RTP RTCP SDP基础知识
理论 流(Streaming ) 是近年在 Internet 上出现的新概念,其定义非常广泛,主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种 顺序流式传输 (Progressive Streaming) 实时流式传输 (Real time Streaming) …...

静态变量、变量作用域、命名空间
静态变量 静态变量一般位于程序全局data区,只是编程语言根据它所在的scope做语言级别访问限制。 静态变量和全局变量 可以在C语言一个函数中定义static变量,并比较和全局变量的地址差异。 C系语言使用static关键字标示静态变量。 PHP使用大写的STATIC关键…...

Android笔记(二十四)基于Compose组件的MVVM模式和MVI模式的实现
仔细研究了一下MVI(Model-View-Intent)模式,发现它和MVVM模式非常的相识。在采用Android JetPack Compose组件下,MVI模式的实现和MVVM模式的实现非常的类似,都需要借助ViewModel实现业务逻辑和视图数据和状态的传递。在这篇文章中,…...

MySQL 是否支持 XML
MySQL 是否支持 XML:概述与应用 虽然 MySQL 主要以处理关系型数据为主,但它也提供了对 XML 数据的支持。XML(可扩展标记语言)是一种用于数据传输和存储的通用格式。在许多应用场景中,XML 被广泛用于数据交换、配置文件…...

pikachu靶场总结(四)
九、越权漏洞 1.概述 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。 一般越权漏洞容易出现在权限页面(需要登…...

24.3 基于文件的服务发现模式
本节重点介绍 : 基于文件的服务发现提供了一种配置静态目标的更通用的方法可以摆脱对特定服务发现源的依赖通常的做法是调用内部CMDB的接口获取target数据,打上标签,生成json文件发给prometheus采集 基于文件的服务发现模式 解决的问题 之前手动配置…...

【Java】面向UDP接口的网络编程
【Java】面向UDP接口的网络编程 一. 基本通信模型二. APIDatagramSocketDatagramPacket 三. 回显服务器/客户端示例服务器客户端总结 一. 基本通信模型 UDP协议是面向数据报的,因此此处要构建数据报(Datagram)在进行发送。 二. API DatagramSocket DatagramSocke…...

SRS服务器搭建
1、配置 listen 1935; max_connections 1000; #srs_log_tank file; #srs_log_file ./objs/srs.log; daemon on; http_api { enabled on; listen 1985; } http_server { enabled on; listen 808…...

iMazing只能苹果电脑吗 Win和Mac上的iMazing功能有区别吗
在当今数字时代,管理和备份手机数据变得越来越重要。无论是转移照片、备份短信,还是管理应用程序,一个强大的工具可以大大简化这些操作。iMazing作为一款备受好评的iOS设备管理软件,已经成为许多用户的选择。但是,许多…...

ChatGPT可以分析股票吗?
结合国庆前大A股市的小波牛市以及今天的股市表现,我从多个角度为你提供一些分析和建议: 一、国庆前的小波牛市分析 国庆前,大A股市出现了一波小幅上涨,市场呈现出一些积极的信号: 政策面利好:政府出台了…...

Dockerfile搭建镜像
Dockerfile搭建镜像的优势与区别 引言 在现代软件开发与运维中,容器化技术日益普及,而Docker作为最流行的容器化平台之一,通过Dockerfile提供了一种灵活、自动化的方式来构建Docker镜像。Dockerfile使得镜像的构建过程可重复、可版本化&…...

Kubernetes-Kind篇-01-kind搭建测试集群
1、Kind 介绍 官方文档地址:https://kind.sigs.k8s.io/ github仓库地址:https://github.com/kubernetes-sigs/kind 国内镜像仓库地址:https://gitcode.com/gh_mirrors/ki/kind/overview kind 是一种使用 Docker 容器 nodes 运行本地 Kubern…...

在UniApp中高效处理大量文件请求的策略
在开发跨平台应用时,尤其是在使用UniApp这样的框架时,我们可能会遇到需要同时请求多个文件的情况。然而,不加节制地同时发起大量请求可能会带来严重的性能问题,如界面卡顿、内存溢出、网络带宽饱和等。本文将探讨如何在UniApp中高…...

docker compose入门4—常用命令
在使用 Docker Compose 管理多容器应用时,常见的命令帮助我们高效地管理容器的生命周期、服务、日志等。以下是一些常用的 Docker Compose 命令及其详细讲解: 1. docker-compose up 这个命令用于启动定义在 docker-compose.yml 文件中的服务。 用法&am…...

wps文本框文字居中对齐
直接点对齐里的水平居中,垂直居中是将文本框水平垂直居中,文字不会居中 将文本框里的文字居中: 垂直居中: 水平居中:...

注册信息页面
知识点: !+Enter 直接生成前端基本框架 1.<h1></h1> (2,3,4,5) 表示各级标题 2.<form></form> 表单建立 3.<input type" "></input> 表格(表单嵌套表格) type属…...

详解Java中的BIO、NIO、AIO
1、 详解Java中的BIO、AIO、NIO 1.1、引言 IO流是Java中比较难理解的一个知识点,但是IO流在实际的开发场景中经常会使用到,比如Dubbo底层就是NIO进行通讯。本文将介绍Java发展过程中出现的三种IO:BIO、NIO以及AIO,重点介绍NIO。…...

CAN和CANFD如何转换和通信
随着科技的发展,汽车电子和工业领域中CAN通信需要承载数据量也越来越大,传统CAN通信有了向CANFD通信过渡的倾向。在实现过渡的过程中可能会出现自己设备是CAN通信,客户设备是CANFD通信的情况,或者自己设备是CANFD通信,…...

QDateTimeEdit Class
Header:#include qmake:QT += widgets Inherits:QAbstractSpinBox Inherited By:QDateEdit and QTimeEdit Public Types enum Section {NoSection, AmPmSection, MSecSection, SecondSection, MinuteSection, …, YearSection } flags SectionsProperties calendarPopu…...

Windows环境安装CentOS7
【注意】安装CentOS需要先安装Vmware虚拟机 【下载前准备】 一、下载CentOS 7镜像文件阿里云镜像开源,点击跳转 二、安装VMware(17): a. 官网,点击跳转 b. 许可证:JU090-6039P-08409-8J0QH-2YR7F 安装V…...

用docker启动mysql步骤
以下是在 Docker 中启动 MySQL 的详细步骤: **一、拉取 MySQL 镜像 ** 1. 打开终端,确保 Docker 服务正在运行。可以使用以下命令检查 Docker 服务状态: sudo systemctl status docker 2. 使用以下命令拉取 MySQL 官方镜像: d…...

[Linux] Linux 初识进程地址空间 (进程地址空间第一弹)
标题:[Linux] Linux初识进程地址空间 个人主页水墨不写bug (图片来源于AI) 目录 一、什么是进程地址空间 二、为什么父子进程相同地址的变量的值不同 三、初识虚拟地址、页表 一、什么是进程地址空间 其实,在很久之前…...

力扣21~25题
21题(简单): 分析: 按要求照做就好了,这种链表基本操作适合用c写,python用起来真的很奇怪 python代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, v…...

04. prometheus 监控 Windows 服务器
prometheus 监控 Windows 服务器 1. 下载安装 Windows_exporter 安装包下载:https://github.com/prometheus-community/windows_exporter/releases 下载 msi 版本,上传至要监控的 Windows 服务器,双击安装即可,exporter 会自动…...