一文详解如何从 Oracle 迁移数据到 DolphinDB

Oracle 是一个广泛使用的关系型数据库管理系统,它支持 ACID 事务处理,具有强大的安全性和可靠性,因此被广泛应用于各种企业级应用程序。但是,随着数据规模的增加和业务需求的变化,Oracle 的一些限制和缺点也逐渐暴露出来。例如,Oracle 的许可证费用昂贵,而且对于海量数据的处理能力较弱。因此,一些企业开始寻找更高效、更灵活的解决方案,以满足业务需求。

DolphinDB 是一种高效、分布式的数据管理和分析平台,它可以轻松地处理海量数据,支持实时数据分析和处理。DolphinDB 使用了基于内存的数据存储方式和多线程并行计算技术,因此具有很高的性能和可扩展性,适合于各种大规模数据处理场景。DolphinDB 还支持多种编程语言,包括 SQL、Python、Java 等,方便开发人员进行数据处理和分析。

在这种情况下,数据迁移变得非常重要。迁移数据可以帮助企业将数据从 Oracle 迁移到更高效、更灵活的解决方案,以便更好地管理和分析数据。此外,数据迁移还可以帮助企业减少许可证费用,提高数据处理的效率,以及满足不断变化的业务需求。

实现方法

Oracle 迁移数据到 DolphinDB 的整体框架如下:

从 Oracle 迁移数据到 DolphinDB 的方法有以下二种:

  • ODBC 插件

ODBC(Open Database Connectivity) 插件是 DolphinDB 提供的通过 ODBC 接口访问 Oracle 的开源产品。使用插件配合 DolphinDB 脚本使用,与服务器在同一个进程空间内运行,能高效地完成 Oracle 数据到 DolphinDB 的数据写入。

ODBC 提供如下函数,函数的具体使用请参考 ODBC/README_CN.md。

  1. odbc::connect(connStr, [dataBaseType])
  2. odbc::close(conn)
  3. odbc::query(connHandle or connStr, querySql, [t], [batchSize], [tranform])
  4. odbc::execute(connHandle or connStr, SQLstatements)
  5. odbc::append(connHandle, tableData, tablename, [createTableIfNotExist], [insertIgnore])
  • DataX 驱动

DataX 是可扩展的数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的 Reader 插件,以及向目标端写入数据的 Writer 插件,理论上 DataX 框架可以支持任意数据源类型的数据同步工作。

DolphinDB 提供基于 DataXReader 和 DataXWriter 的开源驱动。DolphinDBWriter 插件实现了向 DolphinDB 写入数据,使用 DataX 的现有 reader 插件结合 DolphinDBWriter 插件,即可实现从不同数据源向 DolphinDB 同步数据。用户可以在 Java 项目中包含 DataX 的驱动包,开发从 Oracle 数据源到 DolphinDB 的数据迁移软件。

应用需求

很多之前存储在 Oracle 的业务数据,可以通过上述的两种方式将数据同步到 DolphinDB 中。本文的实践案例基于 2021.01.04 号一天的逐笔成交数据,数据量约 2721 万。其部分数据示例如下:

SecurityIDTradeTimeTradePriceTradeQtyTradeAmountBuyNoSellNoTradeIndexChannelNoTradeBSFlagBizIndex
6000202021.01.04T09:25:00.6303.3921007,119.8596178316197191N123713
6000202021.01.04T09:25:00.6303.3910003,390.12994578316197201N123714
6000202021.01.04T09:25:00.6303.399003,051.15803978316197211N123715
6000202021.01.04T09:25:00.6303.39500016,950.158039158092197221N123716
6000202021.01.04T09:25:00.6303.39660022,374.158039118594197231N123717
6000202021.01.04T09:25:00.6303.3925008,475.158039138050197241N123718
6000202021.01.04T09:25:00.6303.394001,356.42283138050197251N123719
6000202021.01.04T09:25:00.6303.39100339.4228338902197261N123720
6000202021.01.04T09:25:00.6303.39388313,163.374228345597197271N123721
6000202021.01.04T09:25:00.6303.391200040,680.42283168862197281N123722

迁移案例与操作步骤

环境配置

本次案例中使用了以下数据库及插件,各版本型号如下:

Oracle 版本:Oracle Database 21c Enterprise Edition(社区版)

unixODBC 版本:2.3.7

DolphinDB Server 版本:2.00.9.3

DolphinDB GUI 版本:1.30.21.4

2.00.9.3 版本 Server 自带 ODBC 插件,位于 Server 的 <HomeDir>/plugins 目录,可直接加载使用。如果 <HomeDir>/plugins 目录下不存在 ODBC 文件夹,则通过如下链接下载:

DolphinDBPlugin 分支:release200.9

请注意,DolphinDB ODBC 插件版本号必须与 Server 版本号一致,否则可能出现报错。例如,DolphinDB Server 版本号为 2.00.9.X,则必须使用 release200.9 分支的 ODBC 插件。

如果想自行编译,请参考: ODBC/README_CN.md 文章中的第2章。

建库建表

Oracle 建表语句如下:

create table ticksh(SecurityID         varchar2(20) ,TradeTime       	 TIMESTAMP,TradePrice         FLOAT,TradeQty 	         NUMBER(38),TradeAmount        NUMBER(38,4),BuyNo              NUMBER(38),SellNo             NUMBER(38),TradeIndex         NUMBER(38),ChannelNo          NUMBER(38),TradeBSFlag        VARCHAR2(10),BizIndex           INTEGER
);

对于实际的数据,需要综合考虑被迁移数据的字段、类型、数据量,在 DolphinDB 是否需要分区,分区方案,使用 OLAP 还是 TSDB 引擎等情况,去设计建库建表方案。一些数据存储库表设计实践,可以参考 DolphinDB 数据库分区教程。

本例建库建表文件 createTable.dos 内容如下:

def createTick(dbName, tbName){if(existsDatabase(dbName)){dropDatabase(dbName)}db1 = database(, VALUE, 2020.01.01..2021.01.01)db2 = database(, HASH, [SYMBOL, 10])db = database(dbName, COMPO, [db1, db2], , "TSDB")db = database(dbName)name = `SecurityID`TradeTime`TradePrice`TradeQty`TradeAmount`BuyNo`SellNo`ChannelNo`TradeIndex`TradeBSFlag`BizIndextype = `SYMBOL`TIMESTAMP`DOUBLE`INT`DOUBLE`INT`INT`INT`INT`SYMBOL`INTschemaTable = table(1:0, name, type)db.createPartitionedTable(table=schemaTable, tableName=tbName, partitionColumns=`TradeTime`SecurityID, compressMethods={TradeTime:"delta"}, sortColumns=`SecurityID`TradeTime, keepDuplicates=ALL)
}dbName="dfs://TSDB_tick"
tbName="tick"
createTick(dbName, tbName)

从 Oracle 迁移到 DolphinDB 的数据字段映射关系如下表:

Oracle 字段含义Oracle 字段Oracle 数据类型DolphinDB 字段含义DolphinDB 字段DolphinDB 数据类型
证券代码SecurityIDVARCHAR2(20)证券代码SecurityIDSYMBOL
交易时间TradeTimeTIMESTAMP交易时间TradeTimeTIMESTAMP
交易价格TradePriceFLOAT交易价格TradePriceDOUBLE
交易数量TradeQtyNUMBER(38)交易数量TradeQtyINT
交易金额TradeAmountNUMBER(38,4)交易金额TradeAmountDOUBLE
买方委托索引BuyNoNUMBER(38)买方委托索引BuyNoINT
卖方委托索引SellNoNUMBER(38)卖方委托索引SellNoINT
成交编号TradeIndexNUMBER(38)成交编号TradeIndexINT
频道代码ChannelNoNUMBER(38)频道代码ChannelNoINT
成交方向TradeBSFlagVARCHAR2(10)成交方向TradeBSFlagSYMBOL
业务序列号BizIndexINTEGER业务序列号BizIndexINT

通过 ODBC 迁移

安装 ODBC 驱动

本例中部署 DolphinDB 的服务器操作系统为 Centos。

1. 在安装 Oracle 的客户端前,需先安装 unixODBC 库,使用以下命令安装:

Centos 系统:

# 安装 unixODBC 库
yum install unixODBC unixODBC-devel

如果是 Ubuntu 系统,使用以下命令安装:

# 安装 unixODBC 库
apt-get install unixodbc unixodbc-dev

2. 下载 Oracle 的 ODBC 驱动并安装

根据 Oracle 官方的要求,安装 Instant Client ODBC 前,需首先安装 Oracle Instant Client Basic 或 Basic Light 软件包,根据官方提供的建议确定需要的安装内容。Oracle 官方安装说明:Oracle Instant Client ODBC 安装说明 。

确定好需要的安装内容后,可在官方提供的下载链接中 Oracle Instant Client Downloads 根据当前的操作系统和处理器进入到对应的下载链接,比如本文使用的是 Linux 操作系统,x86-64 的指令。进入到下载链接 Instant Client for Linux x86-64 (64-bit) 。然后根据 Oracle 的版本选择对应的 Client 版本并进行下载。

注意:目前官网上没有给出详细的客户端版本和 Oracle 数据库版本的对应关系,从网上查到的资料来看,如果读者的 Oracle 版本是11.2.xx 版本及以上,可以下载使用最新的客户端版本。版本的最终建议请以官方提供的信息为准。

可以通过以下方式直接在 Linux 系统中下载对应的安装包:

wget https://download.oracle.com/otn_software/linux/instantclient/217000/instantclient-basic-linux.x64-21.7.0.0.0dbru.zip
wget https://download.oracle.com/otn_software/linux/instantclient/217000/instantclient-odbc-linux.x64-21.7.0.0.0dbru.zip

安装 Oracle 的 ODBC 客户端:

//安装解压
mkdir /usr/local/oracle          //存储 oracle-client and oracle-odbc
mkdir /etc/oracle                //存储 tnsnames.ora
unzip instantclient-basic-linux.x64-21.7.0.0.0dbru.zip -d /usr/local/oracle/
unzip instantclient-odbc-linux.x64-21.7.0.0.0dbru.zip -d /usr/local/oracle/

3. 配置 ODBC 配置文件

1)odbcinst.ini 文件用于设置 ODBC 的某个 Driver 要用到的 ODBC 驱动库的文件路径。 需要在 /etc/odbcinst.ini 中增加以下内容(如果配置文件不存在,需手工创建) :

[ORAC21c]
Description     = Oracle ODBC driver for Oracle 21c
Driver          = /usr/local/oracle/instantclient_21_7/libsqora.so.21.1

2)/etc/odbc.ini 文件用于设置 ODBC 的某个 Dsn 所用到的 Driver 、账号信息、远程数据库地址以及所要使用的数据库等配置,更多配置项可参考 ODBC 连接字符串配置。其中的 Driver 为 /etc/odbcinst.ini 文件中配置的第一行方括号中的内容。添加内容如下(如果配置文件不存在,需手工创建):

[orac]
Description = odbc for oracle
Driver      = ORAC21c
UserID      = system
Password    = dolphindb123
ServerName = ORAC21
Database  = test

3)Oracle 的 ODBC 驱动需要额外在 /etc/oracle/tnsnames.ora 文件中添加 Oracle 数据库的 IP、PORT 以及 SID 信息。其中 ORAC 配置项名为 /etc/odbc.ini 文件中配置的 ServerName。 在 etc/oracle/tnsnames.ora 添加(如果配置文件不存在,需手工创建):

ORAC=
(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = <oracle ip>)(PORT = 1521)))(CONNECT_DATA =(SID=ora21c))
)

注意:理论上 tnsnames.ora 的配置内容可以直接放到 odbc.ini 配置文件中,不影响 ODBC 连接 Oracle 数据库,但是根据实践来看,Oracle 的 ODBC 某些接口仍然会使用到 tnsnames.ora 配置文件,所以该文件必须配置。

4. 测试 ODBC 连接

配置环境变量:

vi ~/.bashrcexport LD_LIBRARY_PATH=/usr/local/oracle/instantclient_21_7:$LD_LIBRARY_PATH
export TNS_ADMIN=/etc/oracle

使配置生效:

source ~/.bashrc

测试连接及预期结果如下:

isql -v orac/**********output********/
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> 

也可以在 DolphinDB 安装包的配置文件中增加环境变量配置,这样每次启动 DolphinDB 即可增加环境配置。如果是单节点模式,可以在 startSingle.sh 文件中添加如下环境变量,如果是集群模式,需要在 startAgent.sh 文件中添加,内容如下:

export LD_LIBRARY_PATH=/usr/local/oracle/instantclient_21_7:$LD_LIBRARY_PATH
export TNS_ADMIN=/etc/oracle
export NLS_LANG='AMERICAN_AMERICA.AL32UTF8'

5. 可能缺少的文件

安装 Oracle Instant Client 时,如果是使用离线安装的,可能会提示缺少 libsqora 、libodbcinst 、libnsl 等,这里提供相关的安装命令,也可以从网上下载到需要的 lib 并手工传到服务器上,命令如下:

yum install libaio
yum install libnsl
# 有些是缺少链接,而不是缺少文件
ln -s libodbcinst.so.2.0.0 libodbcinst.so.1

其他常见问题,可参考 ODBC_plugin_user_guide.md 文章中的第五章注意事项和常见问题。

同步数据

1. 运行以下命令加载 ODBC 插件( ServerPath 请自行修改)

loadPlugin("ServerPath/plugins/odbc/PluginODBC.txt")

2. 运行以下命令建立与 Oracle 的连接 ( Dsn 的名称请自行修改)

conn = odbc::connect("Dsn=orac", `Oracle)

3. 运行以下命令开始同步数据

def transForm(mutable msg){msg.replaceColumn!(`TradeQty, int(msg[`TradeQty]))msg.replaceColumn!(`BuyNo, int(msg[`BuyNo]))msg.replaceColumn!(`SellNo, int(msg[`SellNo]))msg.replaceColumn!(`ChannelNo, int(msg[`ChannelNo]))msg.replaceColumn!(`TradeIndex, int(msg[`TradeIndex]))msg.replaceColumn!(`BizIndex, int(msg[`BizIndex]))return msg
}def syncData(conn, dbName, tbName, dt){sql = "select SecurityID, TradeTime, TradePrice, TradeQty, TradeAmount, BuyNo, SellNo, ChannelNo, TradeIndex, TradeBSFlag, BizIndex from ticksh"if(!isNull(dt)) {sql = sql + " WHERE trunc(TradeTime) = TO_DATE('"+dt+"', 'yyyy.MM.dd')"}odbc::query(conn,sql, loadTable(dbName,tbName), 100000, transForm)
}dbName="dfs://TSDB_tick"
tbName="tick"
syncData(conn, dbName, tbName, NULL)

数据共 27211975 条,同步数据耗时约210秒。

4. 后台多任务同步数据

本教程中 DolphinDB 的数据库按天分区,如果需要同步多天的数据,可以提交多个任务到后台:

for(dt in 2021.01.04..2021.01.05){submitJob(`syncOracTick, `syncOracTick, syncData, conn, dbName, tbName, dt)
}
// 查看后台任务
select * from getRecentJobs() where jobDesc = `syncOracTick

通过 DataX 迁移

部署 DataX

从 DataX 下载地址 下载 DataX 压缩包后,解压至自定义目录。

部署 DataX-DolphinDBWriter 插件

将 DataX-DolphinDBWriter 中源码的 ./dist/dolphindbwriter 目录下所有内容拷贝到 DataX/plugin/writer 目录下,即可使用。

执行 DataX 任务

1. 配置 json 文件

配置文件 oracleddb.json 的具体内容如下,并将 json 文件置于自定义目录下,本教程中方放置于 datax-writer-master/ddb_script/ 目录下。

{"job": {"content": [{"writer": {"parameter": {"dbPath": "dfs://TSDB_tick","userId": "admin","tableName": "tick","host": "127.0.0.1","pwd": "123456","table": [{"type": "DT_SYMBOL","name": "SecurityID"},{"type": "DT_TIMESTAMP","name": "TradeTime"},{"type": "DT_DOUBLE","name": "TradePrice"},{"type": "DT_INT","name": "TradeQty"},{"type": "DT_DOUBLE","name": "TradeAmount"},{"type": "DT_INT","name": "BuyNo"},{"type": "DT_INT","name": "SellNo"},{"type": "DT_INT","name": "TradeIndex"},{"type": "DT_INT","name": "ChannelNo"},{"type": "DT_SYMBOL","name": "TradeBSFlag"},{"type": "DT_INT","name": "BizIndex"}],"port": 8858},"name": "dolphindbwriter"},"reader": {"parameter": {"username": "system","column": ["SecurityID", "TradeTime", "TradePrice", "TradeQty", "TradeAmount", "BuyNo", "SellNo", "ChannelNo", "TradeIndex", "TradeBSFlag", "BizIndex"],"connection": [{"table": ["ticksh"],"jdbcUrl": ["jdbc:oracle:thin:@127.0.0.1:1521:ora21c"]}],"password": "dolphindb123","where": ""},"name": "oraclereader"}}],"setting": {"speed": {"channel": 1}}}
}

2. Linux 终端中执行以下命令以执行 DataX 任务

cd ./dataX/bin/
python datax.py --jvm=-Xmx8g ../../datax-writer-master/ddb_script/oracleddb.json

部分 DataX 版本需要使用以下方式,配置 jvm 内存:

python datax.py --jvm="-Xms1g -Xmx8g" ../../datax-writer-master/ddb_script/oracleddb.json

3. 查看 DataX 同步结果

任务启动时刻                    : 2023-06-06 15:41:34
任务结束时刻                    : 2023-06-06 15:45:49
任务总计耗时                    :                254s
任务平均流量                    :            6.44MB/s
记录写入速度                    :         107133rec/s
读出记录总数                    :            27211975
读写失败总数                    :                   0

基准性能

分别使用 ODBC 插件和 DataX 驱动进行数据迁移, 数据量 2721 万条,迁移耗时对比如下表所示:

ODBC插件DataX
210s254s

综上,ODBC 插件与 DataX 均能实现将 Oracle 中数据迁移到 DolphinDB 中,但是各有优缺点:

  • ODBC 使用简单,适合灵活导入数据,但是运维管理不便。
  • DataX 需要编写复杂的导入配置,但是其扩展灵活,方便监控,社区支持丰富。

用户可以根据自己数据量的大小以及工程化的便捷性选择合适的导入方式。

附录

DolphinDB 写插件配置项

配置项是否必须数据类型默认值描述
hoststringServer Host
portintServer Port
userIdstringDolphinDB 用户名
导入分布式库时,必须要有权限的用户才能操作,否则会返回
pwdstringDolphinDB 用户密码
dbPathstring需要写入的目标分布式库名称,比如 "dfs://MYDB"。
tableNamestring目标数据表名称
batchSizeint10000000DataX 每次写入 DolphinDB 的批次记录数
table写入表的字段集合,具体参考后续 table 项配置详解
saveFunctionNamestring自定义数据处理函数。若未指定此配置,插件在接收到 reader 的数据后,会将数据提交到 DolphinDB 并通过 tableInsert 函数写入指定库表;如果定义此参数,则会用指定函数替换 tableInsert 函数。
saveFunctionDefstring数据入库自定义函数。此函数指用 DolphinDB 脚本来实现的数据入库过程。 此函数必须接受三个参数:dfsPath (分布式库路径), tbName (数据表名), data (从 DataX 导入的数据, table 格式)

table 配置详解

table 用于配置写入表的字段集合。内部结构为

 {"name": "columnName", "type": "DT_STRING", "isKeyField":true}

请注意此处列定义的顺序,需要与原表提取的列顺序完全一致。

  • name :字段名称。
  • isKeyField:是否唯一键值,可以允许组合唯一键。本属性用于数据更新场景,用于确认更新数据的主键,若无更新数据的场景,无需设置。
  • type:枚举值以及对应 DolphinDB 数据类型如下:
DolphinDB 类型配置值
DOUBLEDT_DOUBLE
FLOATDT_FLOAT
BOOLDT_BOOL
DATEDT_DATE
MONTHDT_MONTH
DATETIMEDT_DATETIME
TIMEDT_TIME
SECONDDT_SECOND
TIMESTAMPDT_TIMESTAMP
NANOTIMEDT_NANOTIME
NANOTIMETAMPDT_NANOTIMETAMP
INTDT_INT
LONGDT_LONG
UUIDDT_UUID
SHORTDT_SHORT
STRINGDT_STRING
SYMBOLDT_SYMBOL

完整代码及测试数据

DataX: oracleddb.json

DolphinDB:

  1. createTable.dos
  2. 迁移.txt

测试数据: tick.csv (1万行)

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

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

相关文章

UE5 Android下载zip文件并解压缩到指定位置

一、下载是使用市场的免费插件 二、解压缩是使用市场的免费插件 三、Android路径问题 windows平台下使用该插件没有问题&#xff0c;只是在Android平台下&#xff0c;只有使用绝对路径才能进行解压缩&#xff0c;所以如何获得Android下的绝对路径&#xff1f;增加C文件获得And…

el-table样式

1、实现效果&#xff0c;外部框是蓝绿色边框&#xff0c;深色背景&#xff0c;里面的表格首先设置透明色&#xff0c;然后应用自定义斑马纹。 2、代码 template代码&#xff0c;其中样式frameBordStyle是深色背景框&#xff0c;不负责表格样式&#xff0c;表格样式由tableStyl…

SQL SERVER 表分区

1. 概要说明 SQL SERVER的表分区功能是为了将一个大表&#xff08;表中含有非常多条数据&#xff09;的数据根据某条件&#xff08;仅限该表的主键&#xff09;拆分成多个文件存放&#xff0c;以提高查询数据时的效率。创建表分区的主要步骤是 1、确定需要以哪一个字段作为分…

Linux常用命令——chgrp命令

在线Linux命令查询工具 chgrp 用来变更文件或目录的所属群组 补充说明 chgrp命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中&#xff0c;组名可以是用户组的id&#xff0c;也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文…

白嫖必看!500条chatgpt提示词任你使用

你可能好奇&#xff0c;什么是prompt? 简单来说&#xff0c;prompt就是chatgpt的启动口令&#xff08;即提示词&#xff09;&#xff0c;是指通过特定问题来启动AI助手的创作。 使用它非常简单&#xff0c;只需在chatgpt前输入一句话或几个关键词&#xff0c;就能让AI助手理解…

故障诊断模型 | Maltab实现GRU门控循环单元故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现GRU门控循环单元故障诊断 模型描述 利用各种检查和测试方法,发现系统和设备是否存在故障的过程是故障检测;而进一步确定故障所在大致部位的过程是故障定位。故障检测和故障定位…

word文档中宏的使用(使用VBA批量修改表格样式)

1. 找到工具栏中“视图-》宏” 2. 选择“查看宏” 3. 创建/编辑宏 4. 修改“表格背景和设定字体大小”代码 如图&#xff1a; 代码块&#xff1a; Sub 修改表格字体()修改表格字体 宏For i 1 To ActiveDocument.Tables.CountDim t As TableSet t ActiveDocument.Tables(i)…

我的架构复盘

1、背景 我目前公司研发中心担任软件研发负责人&#xff0c;研发中心分为3组&#xff0c;总共有30多人。研发中心主要开发各类生产辅助工具&#xff0c;比如巡检、安全教育等系统。系统不对外&#xff0c;只在公司内部使用。 就我个人来说&#xff0c;作为研发负责人&#xf…

【STL】:list用法详解

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关list的使用&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构…

【嵌入式项目应用】__用于搭建调试输出、建立时间系统的嵌入式框架“Zorb Framework”

目录 一、什么是Zorb&#xff1f; 二、嵌入式环境搭建 三、调试输出 四、实现断言 五、建立时间系统 六、结束语 (*&#xffe3;︶&#xffe3;)创作不易&#xff01;期待你们的 点赞、收藏和评论喔。 一、什么是Zorb&#xff1f; Zorb Framework是一个基于面向对象的思…

数据库的事务四大特性(ACID)、详解隔离性以及隔离级别、锁

文章目录 &#x1f389;数据库的事务四大特性&#xff08;ACID&#xff09;以及隔离性一、事务的四大特性✨1、原子性&#xff08;Atomicity&#xff09;&#x1f38a;2、一致性&#xff08;Consistency&#xff09;&#x1f38a;3、隔离性&#xff08;Isolation&#xff09;&a…

双十一首日捷报 | 德施曼率先破亿,再度蝉联智能锁品类第一

10月31日晚8:00&#xff0c;各大平台迎来了双十一第一波现货开售。其中&#xff0c;在智能锁类目中德施曼势头最为迅猛&#xff0c;此前&#xff0c;德施曼凭借“全民换锁季”主题活动&#xff0c;在预售期间就已经全面引爆消费者换锁热潮&#xff0c;随着此次现货开售&#xf…

Linux内存管理的分页机制

分段机制的原理如下&#xff1a; 分段机制下的虚拟地址由两部分组成&#xff0c;段选择子和段内偏移量。段选择子就保存在段寄存器里面。段选择子里面最重要的是段号&#xff0c;用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。虚拟地址中的段内偏移量…

bitlocker恢复保护时出现 驱动器加密错误 向导初始化失败 系统找不到指定文件

环境&#xff1a; Win 10专业版 联想E14 Gen2 问题描述&#xff1a; bitlocker恢复保护时出现 驱动器加密错误 向导初始化失败 系统找不到指定文件 电脑更换主板后&#xff0c;重新恢复保护出现 驱动器加密错误 解决方案&#xff1a; 1.尝试重启电脑&#xff08;未解决&a…

Java进阶(List)——面试时List常见问题解读 结合源码分析

前言 List、Set、HashMap作为Java中常用的集合&#xff0c;需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中List集合的面试问题&#xff0c;结合源码分析题目背后的知识点。 关于的Set的博客文章如下&#xff1a; Java进阶&#xff08;Set&#xff09;——面试时…

PowerToys使用:Windows自定义键盘(非编程)

使用紧凑型键盘或者苹果键盘有时候觉得挺麻烦&#xff0c;常用的键偏偏没有&#xff0c;特别是苹果键盘&#xff0c;没有【del】键&#xff0c;非常非常不爽。 笔记本电脑用久了&#xff0c;难免弄坏一两个键&#xff0c;比如【s】键&#xff0c;维修挺麻烦的&#xff0c;换新太…

爬虫 | 【实践】百度搜索链接爬取,生成标题词云 | 以“AI换脸”为例

目录 &#x1f4da;链接爬取 &#x1f407;流程梳理 &#x1f407;代码实现 &#x1f407;结果 &#x1f4da;词云生成 &#x1f407;代码实现 &#x1f407;结果 &#x1f4da;链接爬取 &#x1f407;流程梳理 总体流程是&#xff1a;构建搜索链接 -> 发送HTTP请求…

脉冲输出的三种模式

1.脉冲 方向 2.CW/CCW 3.A/B相&#xff08;AB正交脉冲&#xff09; 脉冲输出模式&#xff1a; 是指控制信号是单脉冲方式还是双脉冲方式&#xff0c;主要由控制器决定&#xff1b; 如果控制器发送的控制脉冲是单脉冲控制方式&#xff0c;驱动器需要采用单脉冲&#xff1b…

为什么要安装防静电门禁闸机

安装防静电门禁闸机可以带来以下几个方面的好处&#xff1a; 防止静电干扰&#xff1a;静电是一种非常危险的物理现象&#xff0c;它可以对电子元器件、电路板和其他敏感设备造成损害&#xff0c;甚至导致设备故障和生产中断。防静电门禁闸机可以有效地防止静电的产生和传导&am…

Spring Security 中自定义权限表达式

Spring Security 中自定义权限表达式 一. SpEL中使用自定义Bean二. 通过类继承自定义权限表达式2.1 自定义 ExpressionRoot 三. 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在…