Seata 2.x 系列【9】事务会话存储模式

有道无术,术尚可求,有术无道,止于术。

本系列Seata 版本 2.0.0

本系列Spring Boot 版本 3.2.0

本系列Spring Cloud 版本 2023.0.0

源码地址:https://gitee.com/pearl-organization/study-seata-demo

文章目录

    • 1. 概述
    • 2. 存储模式
      • 2.1 文件
      • 2.2 数据库
      • 2.3 Redis
      • 2.4 Raft
    • 3. 选型方案
      • 3.1 高可用
      • 3.2 一致性
      • 3.3 性能
      • 3.4 部署运维成本
      • 3.5 成熟度
      • 3.6 总结

1. 概述

TC(服务端)作为事务协调者,负责维护全局和分支事务的状态,驱动全局事务提交或回滚。在一次全局事务(分布式事务)会话中,TC需要维护一些会话数据(事务状态和记录),比如全局事务信息、分支事务信息、锁信息等。

TC端的作用是保证事务的二阶段被正确执行,这取决于事务记录的正确存储。为确保事务记录不丢失,需要在保持状态正确的前提下,驱动所有的RM执行正确的二阶段行为。

2. 存储模式

Seata服务端支持多种方式存储会话数据:

  • file:本地文件(不支持HA)
  • db:数据库(支持HA)
  • redis:缓存数据库(支持HA)
  • raft:服务端Raft算法实现(支持HA)

模式类型配置说明:

配置项描述备注版本说明
tore.mode存储方式file、db 、redis、raft1.5.1 版本改用 lock 和 session 分离存储,2.0.0 开始支持raft模式
store.lock.mode事务锁信息存储方式file、db、redis,配置为空时,取 store.mode 配置项值,raft 模式不允许单独指定1.5.1 版本新增,session 和 lock可分离存储
store.session.mode事务会话信息存储方式file、db、redis,配置为空时,取 store.mode 配置项值,raft 模式不允许单独指定1.5.1 版本新增,session 和lock可分离存储
store.publicKeydb 或 redis 存储密码解密公钥1.4.2 版本支持

在Nacos控制台配置中心seata.properties文件中,可以看到默认使用的是file存储模式:
在这里插入图片描述

2.1 文件

file模式将会话数据存储在本地文件,以顺序写的形式将事务信息存储到本地磁盘上。为了兼顾性能,默认采用异步方式,并将事务信息存储在内存中,确保内存和磁盘上的数据一致性。当TC意外宕机时,在重新启动时会从磁盘读取事务信息并恢复到内存中,以便继续运行事务上下文。

file模式速度快,但是无法实现会话共享,所以不支持集群模式。

file模式下配置说明:

配置项描述备注
store.file.dir存储文件夹名默认 sessionStore
store.file.maxBranchSessionSize分支 session 最大字节数默认 16384(16kb),单位 byte
store.file.maxGlobalSessionSize全局 session 最大字节数默认 512b,单位 byte
store.file.fileWriteBufferCacheSize buffer 最大缓存大小默认 16384(16kb),单位 byte,写入 session 等数据量大于该值时会抛出异常
store.file.flushDiskMode刷盘策略默认 async,可选 sync
store.file.sessionReloadReadSizeServer 节点重启后从备份文件中恢复的 session 或 lock key 上限个数默认100

配置文件内容如下:
在这里插入图片描述
可以看到,在执行全局事务后,会在seata\bin\file_store\data\8091文件夹下生成一个root.data文件:
在这里插入图片描述

2.2 数据库

db模式采用数据库存储会话信息,依赖于数据库,在数据库中进行事务信息的增删改查操作。一致性由数据库的本地事务保证,数据也由数据库负责持久化到磁盘。基于计算和存储分离的架构设计。

db模式支持mysql、oracle、db2、sqlserver、sybaee、h2、sqlite、access、postgresql、oceanbase等数据库。支持集群,但是需要同步数据结构,依赖数据库,性能也不太高。

将存储模式改为db:
在这里插入图片描述
db模式下配置说明:

配置项描述备注
store.db.datasource数据源类型支持dbcp、druid、hikari ,无默认值
store.db.dbType数据库类型mysql、oracle、db2、sqlserver、sybaee、h2、sqlite、access、postgresql、oceanbase,无默认值
store.db.driverClassName数据库驱动
store.db.url数据库 url在使用 mysql 作为数据源时,建议在连接参数中加上rewriteBatchedStatements=true(批量插入全局锁)
store.db.user数据库账户
store.db.password数据库账户密码
store.db.minConn数据库初始连接数默认 1
store.db.maxConn数据库最大连接数默认 20
store.db.maxWait获取连接时最大等待时间默认 5000,单位毫秒
store.db.globalTable全局事务表名 默认 global_table
store.db.branchTable分支事务表名默认 branch_table
store.db.lockTable全局锁表名 默认 lock_table
store.db.queryLimit查询全局事务一次的最大条数默认 100
store.db.distributedLockTableSever 端事务管理全局锁存储表名默认 distributed_lock,多 Sever 集群下保证同时只有一个 Sever 处理提交或回滚,1.5.1 版本新增

配置文件内容如下:
在这里插入图片描述
db模式下需要创建以下四张表:

  • global_table:全局事务表
  • branch_table:分支事务表
  • lock_table:全局锁表
  • distributed_lock:Sever事务管理全局锁存储表

在seata\script\server\db目录提供了相关脚本:
在这里插入图片描述
官网SQL脚本没有注释,最好使用作者提供的:

-- seata_server.branch_table definitionCREATE TABLE `branch_table` (`branch_id` bigint NOT NULL COMMENT '分支事务ID',`xid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '全局事务唯一标识',`transaction_id` bigint DEFAULT NULL COMMENT '全局事务ID',`resource_group_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '资源分组ID',`resource_id` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '资源ID',`branch_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '事务模式',`status` tinyint DEFAULT NULL COMMENT '分支事务状态(io.seata.core.model.BranchStatus)',`client_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '客户端ID',`application_data` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用数据',`gmt_create` datetime(6) DEFAULT NULL COMMENT '创建时间',`gmt_modified` datetime(6) DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='分支事务会话表';-- seata_server.global_table definitionCREATE TABLE `global_table` (`xid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '全局事务的唯一标识(IP+事务ID)',`transaction_id` bigint DEFAULT NULL COMMENT '全局事务ID',`status` tinyint NOT NULL COMMENT '全局事务状态(io.seata.core.model.GlobalStatus)',`application_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用ID(TM服务名)',`transaction_service_group` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '事务分组名',`transaction_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '开启事务类方法',`timeout` int DEFAULT NULL COMMENT '超时时间',`begin_time` bigint DEFAULT NULL COMMENT '开始时间',`application_data` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用数据',`gmt_create` datetime DEFAULT NULL COMMENT '创建时间',`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (`xid`),KEY `idx_status_gmt_modified` (`status`,`gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='全局事务会话表';-- seata_server.lock_table definitionCREATE TABLE `lock_table` (`row_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '行键',`xid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '全局事务唯一标识',`transaction_id` bigint DEFAULT NULL COMMENT '全局事务ID',`branch_id` bigint NOT NULL COMMENT '分支ID',`resource_id` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '资源ID',`table_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '表名',`pk` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主键对应的值',`status` tinyint NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking锁状态(0,已加锁;1,回滚中)',`gmt_create` datetime DEFAULT NULL COMMENT '创建时间',`gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='全局锁信息表';-- seata_server.distributed_lock definitionCREATE TABLE `distributed_lock` (`lock_key` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '锁键',`lock_value` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '锁值',`expire` bigint DEFAULT NULL COMMENT '过期时间',PRIMARY KEY (`lock_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Sever事务管理全局锁存储表';INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

2.3 Redis

redis模式采用缓存数据库redis会话信息,是Seata 1.4 以后支持的新模式。和db 类似,也是一种事务存储方式,利用 Jedis 和 Lua 脚本来进行事务的增删改查操作,部分操作(如竞争锁)在 Seata 2.x 版本中全部采用了Lua脚本。也依赖于存储方Redis来保证数据的一致性。基于计算和存储分离的架构设计。

redis模式的优点是支持集群,效率较快, 无需要同步数据结构。

将存储模式改为redis:
在这里插入图片描述
db模式下配置说明:

配置项描述备注版本说明
store.redis.mode部署模式默认 single,可选 sentinel1.4.2 版本新增 sentinel 模式
store.redis.single.host主机地址单机模式下 redis 的 host,兼容 1.4.2 之前的版本,该配置为空时选取 store.redis.host 作为配置项1.4.2 版本新增
store.redis.single.port端口单机模式下 redis 的 port,兼容 1.4.2 之前的版本,该配置为空时选取 store.redis.port 作为配置项1.4.2 版本新增
store.redis.sentinel.masterNamesentinel 模式下 redis 的主库名称1.4.2 版本新增
store.redis.sentinel.sentinelHostssentinel 模式下 sentinel 的 host多 hosts 以逗号分隔1.4.2 版本新增
store.redis.host ip默认 127.0.0.11.4.2 版本弃用
store.redis.port端口默认 63791.4.2 版本弃用
store.redis.maxConn最大连接数默认 10
store.redis.minConn最小连接数默认 1
store.redis.database默认库默认 0
store.redis.password密码(无可不填)默认 null
store.redis.queryLimit一次查询最大条数默认 100
store.redis.type主要使用的方式: lua、pipplinepippline

2.4 Raft

Raft官网地址
Seata-Raft 存储模式详解及入门

Raft是一种用于分布式场景下的一致性算法,Seata 2.0开始支持,提供了存算一体的高性能易扩展,入门门槛低,运维成本低等特定的事务存储模式。

Seata-Raft模式的设计思路是通过封装无法高可用的file模式,利用Raft算法实现多个TC之间数据的同步。该模式保证了使用file模式时多个TC的数据一致性,同时将异步刷盘操作改为使用Raft日志和快照进行数据恢复。

注意:

  • 😶😶😶但是目前基于Raft模式的解决方案可能还不够成熟,生产环境切勿使用。😶😶😶
  • 🤫🤫🤫不支持与第三方注册中心搭配,故全链路只允许存在一个TC集群🤫🤫🤫

将存储模式改为raft:
在这里插入图片描述
raft模式下配置说明:

配置项描述备注版本说明
server.raft.group分组,client 的事务分组对应的值要与之对应,如 service.vgroup-mapping.default_tx_group=default默认default2.0.0 版本新增
server.raft.server-addr集群列表2.0.0 版本新增
server.raft.snapshot-interval间隔多久做一次内存快照,每做一次快照将暂停状态机,但是能提高停机恢复速度默认 600 秒2.0.0 版本新增
server.raft.apply-batch任务累积批次后提交至 leader默认 322.0.0 版本新增
server.raft.max-append-bufferSizeraft 日志存储缓冲区最大大小默认 256K 2.0.0 版本新增
server.raft.max-replicator-inflight-msgs在启用 pipeline 请求情况下,最大 in-flight 请求数默认 2562.0.0 版本新增
server.raft.disruptor-buffer-size内部 disruptor buffer 大小,如果是写入吞吐量较高场景,需要适当调高该值默认 163842.0.0 版本新增
server.raft.election-timeout-ms超过多久没有 leader 的心跳开始重选举默认 1000 毫秒2.0.0 版本新增
server.raft.reporter-enabledraft 自身的监控是否开启默认 false2.0.0 版本新增
server.raft.reporter-initial-delay监控输出间隔默认 60 秒2.0.0 版本新增
server.raft.serialization序列化方式,目前仅支持 jackson默认 jackson2.0.0 版本新增
server.raft.compressorraftlog 和 snapshot 的压缩方式,支持 gzip, zstd, lz4none2.0.0 版本新增
server.raft.syncraftlog 同步刷盘true2.0.0 版本新增

配置文件内容如下:
在这里插入图片描述
Seata服务端需要修改注册中心为file:

seata:config:# support: nacos, consul, apollo, zk, etcd3type: nacos# 该配置可以选择不同的配置中心registry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: file # raft模式下不允许使用非file的其他注册中心store:# support: file 、 db 、 redis 、 raftmode: raft # 使用raft存储模式file:dir: sessionStore # 该路径为raftlog及事务相关日志的存储位置,默认是相对路径,最好设置一个固定的位置

Seata客户端事务分组对应的TC集群需要修改为和server.raft.group 一致,并修改注册中心类型为raft:
将tc集群改为server的raft group

seata:tx-service-group: default_tx_groupservice:vgroup-mapping:default_tx_group: 如果server.raft.group为default,那么此处便是defaultregistry:type: raftraft:server-addr: 192.168.0.111:7091, 192.168.0.112:7091, 192.168.0.113:7091

3. 选型方案

Seata当前已经趋于成熟,性能、入门门槛、部署运维成本是未来发展的重点方向。

3.1 高可用

除了file模式外,db、redis、raft模式都支持高可用集群部署。

3.2 一致性

一致性排名如下(由高到低):

  • raft:基于raft一致性算法
  • db:基于数据库事务
  • file:基于异步刷盘
  • redis:基于RDB 和 AOF持久化

3.3 性能

性能排名如下(由高到低):

  • file:基于直接内存
  • redis:基于内存数据库
  • raft:基于raft
  • db:基于数据库

3.4 部署运维成本

部署运维成本排名如下(由高到低):

  • file:默认方式,直接部署即可
  • raft:只需修改配置,无需注册中心
  • redis:依赖于内存数据库,生产环境需要部署注册中心
  • db:基于数据库,需要同步数据接口,生产环境主要部署注册中心

3.5 成熟度

除了新出的raft模式,其他的基本已经很成熟,生产可用。

3.6 总结

raft模式是最理想的方案,但是当前并不成熟,所以不用考虑。

file模式简单易用,但是只支持单机模式部署,生产环境不考虑。

redis和db模式都支持集群部署,redis更易使用,且性能更高,所以推荐redis模式。

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

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

相关文章

在linux上发起get和post请,怎么写

获取用户 curl --location --request GET http://127.0.0.1:8888/API/UserService/GetUserInfo?&token123456789&userId66666666 下面接口参数两部分,url传参和body 新增用户 curl --location --request POST http://127.0.0.1:8888/API/UserService/AddUs…

ubuntu安装docker的详细教程

检查卸载老版本docker ubuntu下自带了docker的库,不需要添加新的源。 但是ubuntu自带的docker版本太低,需要先卸载旧的再安装新的。 注:docker的旧版本不一定被称为docker,docker.io 或 docker-engine也有可能,所以卸…

springboot RocketMQ 客户端 日志配置 rocketmq_client.log过大

项目集成rocketMQ后,日志持续增大,导致磁盘空间逐渐减少,参考官方文档 来正确配置。 打印客户端日志 RocketMQ 的 TCP Java SDK 基于 SLF4J 接口编程。 JavaSDK1.7.8.Final 版本及以上 RocketMQ 的 Java SDK 1.7.8.Final 已内置了日志实现&…

有关整数和浮点数在内存中存储

1. 整数在内存中的存储 整数的2进制表⽰⽅法有三种,即原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最 ⾼位的⼀位是被当做符号位,剩余的都是数值位。 正…

常用芯片学习——BME280芯片

BME280 温湿度气压传感器 芯片介绍 BME280是基于成熟传感原理的组合数字湿度、压力和温度传感器。该传感器块采用极为紧凑的金属盖LGA封装,占地面积仅为2.5x2.5mm2,高度为0.93mm。该传感器提供I2C以及SPI接口。它的小尺寸和低功耗允许在电池驱动的设备…

TCP-IP 知识汇总

开放式系统互联模型------国际化标准组织ISO提出----协议组(协议模型) 应用层:接收用户数据,人机交互的接口 表示层:将编码转换为二进制(加密、解密)---统一格式 会话层:针对传输…

二叉树<II>:二叉树的四种遍历方式代码实现Python3

今天我们来介绍的是二叉树的「前序」、「中序」、「后序」、「层序」四种遍历方式如何用代码实现。 还不知道这四种遍历方式原理的可以看另一篇文章:二叉树<I>:概念及二叉树的前序遍历、中序遍历、后序遍历原理 1. 相关题目 这…

springboot279基于javaweb的影院订票系统的设计与实现

影院订票系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本影院订票系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大…

MySQL语法分类 DML

DML 增删改表中数据 添加数据 //注意: //1.列名和值一一对应 //2.如果不定义列名需要给所有列赋值 //3.除了数字其他类型的值需要引号 insert into 表名(列名1,列名2,...列名n ) values(值1,值2,...值n );//这句需要给所有列赋值 insert into 表名(值1,值2,...值n…

2024.4.17周报

目录 摘要 Abstract 文献阅读:耦合时间和非时间序列模型模拟城市洪涝区洪水深度 现有问题 提出方法 创新点 XGBoost和LSTM耦合模型 XGBoost算法 ​编辑 LSTM(长短期记忆网络) 耦合模型 研究实验 数据集 评估指标 研究目的 洪水…

Orbit 使用指南 03 | 与刚体交互 | Isaac Sim | Omniverse

如是我闻: “在之前的指南中,我们讨论了独立脚本( standalone script)的基本工作原理以及如何在模拟器中生成不同的对象(prims)。在指南03中,我们将展示如何创建并与刚体进行交互。为此&#xf…

48、C++/堆区动态内存管理 类中特殊成员函数学习20240313

一、设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 代码&#xff1a; #include <iostream>us…

2024-03-14学习笔记(YoloV9)

1.认知越高的人&#xff0c;越敬畏因果 摘要&#xff1a;本文讲述了认知越高的人越敬畏因果的道理。通过故事和名人案例&#xff0c;阐述了敬畏因果对于个人成长和成功的重要性。文章强调了遵循规律、不走捷径、正向思维的重要性&#xff0c;以及思维、行动、习惯、性格和命运…

走进volatile的世界,探索它与可见性,有序性,原子性之间的爱恨情仇!

写在开头 在之前的几篇博文中&#xff0c;我们都提到了 volatile 关键字&#xff0c;这个单词中文释义为&#xff1a;不稳定的&#xff0c;易挥发的&#xff0c;在Java中代表变量修饰符&#xff0c;用来修饰会被不同线程访问和修改的变量&#xff0c;对于方法&#xff0c;代码…

Arduino RP2040 LittleFS的使用介绍

Arduino RP2040 LittleFS的使用 &#x1f4cc;RP2040基于Earle F. Philhower, III的开发核心固件&#xff1a;https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json&#x1f388;相关开发文档在线说明&#xff1a;https://ardu…

每日一题——LeetCode2789.合并后数组中的最大元素

方法一 倒序遍历&#xff1a; 将数组倒序过来看&#xff0c;就是从最后一个数开始&#xff0c;如果它前面一个数小于等于它就可以把前面一个数吃掉同时加上前一个数的值形成一个新的数&#xff0c;如果碰到一个更大的数就吃不动了&#xff0c;那么就换那个更大的数去继续吃前面…

实现两个超长正整数(每个最长80位数字)的减法运算。

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 [问题描述] 编写程序实现两个超长正整数(每个最长80位数字)的减法运算。 [输入形式] 从键盘读入两个整数&#xff0c;要考虑输入高位可能为0的情况(如00083)。 1.第一行是超长正整数A; 2.第二行是超长正整数B; [输出形式] …

ts版本微信小程序在wxml保存文件不刷新页面的解决办法

将project.config.json中的skylineRenderEnable改为false "skylineRenderEnable": false

惯导系统静止初始化方法与代码实现并在gazebo中测试

惯导系统静止初始化方法与代码实现并在gazebo中测试 前言静止初始化方法惯导静止初始化实现代码在gazebo中进行测试 前言 在进行GPS加IMU的组合导航或者Lidar加IMU的组合导航时&#xff0c;用EKF或者ESKF的滤波方法时&#xff0c;需要提前知道惯导的测量噪声、初始零偏、重力方…

POJO简介

文章目录 简介POJO与ELB的区别POJO真正的意思 常见的POJO类DTODAOPOVOEntity 简介 什么是POJO&#xff1f;POJO&#xff08;Plain Ordinary Java Object&#xff09;简单的Java对象&#xff0c;实际就是普通JavaBeans&#xff0c;是为了避免和EJB(EJB是Enterprise Java Beans技…