Mongodb 副本集名称重命名
副本集重命名
要重命名副本集,您必须关闭副本集的所有成员,然后使用新的副本集名称配置每个成员的数据库。
此过程需要停机。
先决条件
确保您的副本集未分片。重命名过程仅适用于未分片的副本集。
在重命名副本集之前,请 对 MongoDB 部署执行完整备份。
做好备份非常重要,无论如何,请先在测试环境验证后再执行该操作
启用身份验证后,请确保您的用户角色对每个成员数据库中的集合具有 find、insert 和 remove 权限。
db.runCommand({rolesInfo: { role: "xxxxx", db: "yyyyyy" },showPrivileges: true}
)
授权
db.getUser("admin")
{"_id" : "admin.admin","userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),"user" : "admin","db" : "admin","roles" : [{"role" : "root","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]
}db.createRole({role: "collectionRole",privileges: [{ resource: { db: "local", collection: "system.replset" }, actions: [ "find", "remove", "insert" ] }],roles: []}
)db.grantRolesToUser("admin",[{"role":"collectionRole","db":"admin"}])db.getUser("admin")
{"_id" : "admin.admin","userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),"user" : "admin","db" : "admin","roles" : [{"role" : "root","db" : "admin"},{"role" : "collectionRole","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]
}
关闭副本集成员
此步骤需要停机,因为所有副本成员都需要关闭。
当前副本集名称 “set” : “sit_rs1”
{"set" : "sit_rs1","date" : ISODate("2023-11-10T08:08:08.707Z"),"myState" : 1,......"members" : [{"_id" : 1,"name" : "192.168.88.11:27018","health" : 1,"state" : 2,"stateStr" : "SECONDARY",......},{"_id" : 3,"name" : "192.168.88.11:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY",......},{"_id" : 4,"name" : "192.168.88.11:27019","health" : 1,"state" : 2,"stateStr" : "SECONDARY",.....}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1699603684, 1),"signature" : {"hash" : BinData(0,"yDDKmbDiNNhNxzN+xh20IjGyr3o="),"keyId" : NumberLong("7236938018798436354")}},"operationTime" : Timestamp(1699603684, 1)
}
关闭副本集成员,三台都关闭
# shutdown 27019
su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb27019/data --port 27019 --shutdown"# shutdown 27018
su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb27018/data --port 27018 --shutdown"# shutdown 27017
su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --dbpath /data/mongodb/data --port 27017 --shutdown"
重命名副本集
对每个副本集成员执行以下步骤: ( 以其中一台 27019 为例 )
- 在 不带 --replSet 该选项 的情况下在不同端口上启动副本集成员 (如下注释掉 replication 选项。 端口改为 28019 )
root@ubuntu-x64_01:/opt# cat /etc/mongod27019.conf
systemLog:destination: filepath: "/data/mongodb27019/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb27019/data"journal:enabled: truedirectoryPerDB: true
processManagement:fork: true
net:bindIp: localhost,192.168.88.11#port: 27019port: 28019maxIncomingConnections: 65536
security:keyFile: "/data/mongodb27019/data/replsetAIK"clusterAuthMode: "keyFile"authorization: enabled
#replication:
# replSetName: "sit_rs1"
# enableMajorityReadConcern: true
启动副本集成员:
root@ubuntu-x64_01:/opt# su mongodb -s /bin/bash -c "/usr/local/mongodb/bin/mongod --config /etc/mongod27019.conf 2>&1 >/dev/null &"
更新副本集名称。
如果使用配置文件,请设置 replication.replSetName 为新名称。replSetName: “sit_rs1” 变更为 replSetName: “local_rs1”
root@ubuntu-x64_01:/opt# cat /etc/mongod27019.conf
systemLog:destination: filepath: "/data/mongodb27019/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb27019/data"journal:enabled: truedirectoryPerDB: true
processManagement:fork: true
net:bindIp: localhost,192.168.88.11#port: 27019port: 28019maxIncomingConnections: 65536
security:keyFile: "/data/mongodb27019/data/replsetAIK"clusterAuthMode: "keyFile"authorization: enabled
replication:replSetName: "local_rs1"enableMajorityReadConcern: true
使用以下命令更新本地数据库中的副本集名称:
> use local
switched to db local> db.system.replset.find().pretty()
{"_id" : "sit_rs1","version" : 20,"term" : 249,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [{"_id" : 1,"host" : "192.168.88.11:27018","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 3,"host" : "192.168.88.11:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 4,"host" : "192.168.88.11:27019","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"catchUpTimeoutMillis" : -1,"catchUpTakeoverDelayMillis" : 30000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("6305db8beb57aaf6f57b130e")}
}> var newId = 'local_rs1'> var doc = db.getSiblingDB("local").system.replset.findOne()> var oldId = doc._id> print(oldId, newId)
sit_rs1 local_rs1> doc._id = newId
local_rs1> db.getSiblingDB("local").system.replset.insertOne(doc)
{ "acknowledged" : true, "insertedId" : "local_rs1" }> db.getSiblingDB("local").system.replset.deleteOne({_id: oldId})
{ "acknowledged" : true, "deletedCount" : 1 }> db.getSiblingDB("local").system.replset.find().pretty()
{"_id" : "local_rs1","version" : 20,"term" : 249,"protocolVersion" : NumberLong(1),"writeConcernMajorityJournalDefault" : true,"members" : [{"_id" : 1,"host" : "192.168.88.11:27018","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 3,"host" : "192.168.88.11:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1},{"_id" : 4,"host" : "192.168.88.11:27019","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"slaveDelay" : NumberLong(0),"votes" : 1}],"settings" : {"chainingAllowed" : true,"heartbeatIntervalMillis" : 2000,"heartbeatTimeoutSecs" : 10,"electionTimeoutMillis" : 10000,"catchUpTimeoutMillis" : -1,"catchUpTakeoverDelayMillis" : 30000,"getLastErrorModes" : {},"getLastErrorDefaults" : {"w" : 1,"wtimeout" : 0},"replicaSetId" : ObjectId("6305db8beb57aaf6f57b130e")}
}
关闭副本集成员,在其原始端口上启动副本集成员。如果使用配置文件,请确保将其 replication.replSetName 已经设置为新的副本集名称。
replication:replSetName: "local_rs1"enableMajorityReadConcern: true
在其原始端口上启动副本集成员。
root@ubuntu-x64_01:/opt# cat /etc/mongod27019.conf
systemLog:destination: filepath: "/data/mongodb27019/log/mongod.log"logAppend: true
storage:dbPath: "/data/mongodb27019/data"journal:enabled: truedirectoryPerDB: true
processManagement:fork: true
net:bindIp: localhost,192.168.88.11port: 27019maxIncomingConnections: 65536
security:keyFile: "/data/mongodb27019/data/replsetAIK"clusterAuthMode: "keyFile"authorization: enabled
replication:replSetName: "local_rs1"enableMajorityReadConcern: true
按上面的操作,在另外两个实例都执行一遍后, 执行修改后,整个副本集状态如下:
local_rs1:PRIMARY> rs.status()
{"set" : "local_rs1","date" : ISODate("2023-11-15T11:25:05.087Z"),"myState" : 1,"term" : NumberLong(251),"syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"majorityVoteCount" : 2,"writeMajorityCount" : 2,"votingMembersCount" : 3,"writableVotingMembersCount" : 3,"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"lastCommittedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"readConcernMajorityOpTime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"readConcernMajorityWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"appliedOpTime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"durableOpTime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z")},"lastStableRecoveryTimestamp" : Timestamp(1700047503, 1),"electionCandidateMetrics" : {"lastElectionReason" : "electionTimeout","lastElectionDate" : ISODate("2023-11-15T11:16:43.867Z"),"electionTerm" : NumberLong(251),"lastCommittedOpTimeAtElection" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"lastSeenOpTimeAtElection" : {"ts" : Timestamp(1699610346, 1),"t" : NumberLong(249)},"numVotesNeeded" : 2,"priorityAtElection" : 1,"electionTimeoutMillis" : NumberLong(10000),"numCatchUpOps" : NumberLong(0),"newTermStartDate" : ISODate("2023-11-15T11:16:43.877Z"),"wMajorityWriteAvailabilityDate" : ISODate("2023-11-15T11:16:44.535Z")},"members" : [{"_id" : 1,"name" : "192.168.88.11:27018","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 511,"optime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDurable" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDate" : ISODate("2023-11-15T11:25:03Z"),"optimeDurableDate" : ISODate("2023-11-15T11:25:03Z"),"lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastHeartbeat" : ISODate("2023-11-15T11:25:04.468Z"),"lastHeartbeatRecv" : ISODate("2023-11-15T11:25:03.448Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncSourceHost" : "192.168.88.11:27019","syncSourceId" : 4,"infoMessage" : "","configVersion" : 20,"configTerm" : 251},{"_id" : 3,"name" : "192.168.88.11:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 26,"optime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDurable" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDate" : ISODate("2023-11-15T11:25:03Z"),"optimeDurableDate" : ISODate("2023-11-15T11:25:03Z"),"lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastHeartbeat" : ISODate("2023-11-15T11:25:04.520Z"),"lastHeartbeatRecv" : ISODate("2023-11-15T11:25:04.285Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncSourceHost" : "192.168.88.11:27019","syncSourceId" : 4,"infoMessage" : "","configVersion" : 20,"configTerm" : 251},{"_id" : 4,"name" : "192.168.88.11:27019","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 16264,"optime" : {"ts" : Timestamp(1700047503, 1),"t" : NumberLong(251)},"optimeDate" : ISODate("2023-11-15T11:25:03Z"),"lastAppliedWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"lastDurableWallTime" : ISODate("2023-11-15T11:25:03.985Z"),"syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1700047003, 1),"electionDate" : ISODate("2023-11-15T11:16:43Z"),"configVersion" : 20,"configTerm" : 251,"self" : true,"lastHeartbeatMessage" : ""}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1700047503, 1),"signature" : {"hash" : BinData(0,"FkEFPk5B3ZB364V3c3RkkEoBChI="),"keyId" : NumberLong("7236938018798436354")}},"operationTime" : Timestamp(1700047503, 1)
}
回收权限,由于角色是临时授权的,操作结束后,回收该集合的变更权限
local_rs1:PRIMARY> use admin
switched to db adminlocal_rs1:PRIMARY> db.getUser("admin")
{"_id" : "admin.admin","userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),"user" : "admin","db" : "admin","roles" : [{"role" : "root","db" : "admin"},{"role" : "collectionRole","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]
}local_rs1:PRIMARY> db.revokeRolesFromUser("admin",[{"role":"collectionRole","db":"admin"}])local_rs1:PRIMARY> db.getUser("admin")
{"_id" : "admin.admin","userId" : UUID("adb37ec9-89e9-464b-a241-029194bec6ef"),"user" : "admin","db" : "admin","roles" : [{"role" : "root","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]
}
相关文章:
Mongodb 副本集名称重命名
副本集重命名 要重命名副本集,您必须关闭副本集的所有成员,然后使用新的副本集名称配置每个成员的数据库。 此过程需要停机。 先决条件 确保您的副本集未分片。重命名过程仅适用于未分片的副本集。 在重命名副本集之前,请 对 MongoDB 部…...
C#WPF属性触发器实例
本文讲解C#WPF属性触发器的实例 在属性触发器中,当一个属性发生更改时,它将立即或动画更改另一个属性 实例 <Windowx:Class="TriggerDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://sch…...

Kotlin 核心语法,为什么选择Kotlin ?
Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性。 Kotlin是使用Java开发者的思维被创建的,Intellij作为它主要的开发IDE。对于 Android开发者&#…...

SpringCloud微服务:Nacos的集群、负载均衡、环境隔离
目录 集群 在user-service的yml文件配置集群 启动服务 负载均衡 order-service配置集群 设置负载均衡 当本地集群的服务挂掉时 访问权重 环境隔离 1、Nacos服务分级存储模型 一级是服务,例如userservice 二级是集群,例如杭州或上海 …...

Selenium+Python做web端自动化测试框架实战
最近受到万点暴击,由于公司业务出现问题,工作任务没那么繁重,有时间摸索seleniumpython自动化测试,结合网上查到的资料自己编写出适合web自动化测试的框架,由于本人也是刚刚开始学习python,这套自动化框架目…...

Linux:安装MySQL服务(非docker方式)
1、下载安装包 下载MySQL安装包,需要Oracle官网的账号 下面是网友提供的账号及密码,亲测有效。 账户:3028064308qq.com 我用的这个,可以登陆 密码:OraclePassword123!Oracle Account: 602205528qq.com Oracle Pass…...
C++实现有理数类 四则运算和输入输出
面试 C 程序员,什么样的问题是好问题? - 知乎 https://www.cnblogs.com/bwjblogs/p/12982908.html...

小鸟飞呀飞
欢迎来到程序小院 小鸟飞呀飞 玩法:鼠标控制小鸟飞翔的方向,点击鼠标左键上升,不要让小鸟掉落,从管道中经过,快去飞呀飞哦^^。开始游戏https://www.ormcc.com/play/gameStart/204 html <canvas width"288&quo…...

Unity 场景烘培 ——unity Post-Processing后处理1(四)
提示:文章有错误的地方,还望诸位大神不吝指教! 文章目录 前言一、Post-Processing是什么?二、安装使用Post-Processing1.安装Post-Processing2.使用Post-Processing(1).添加Post-process Volume(…...

Burpsuite抓HTTPS证书导入问题
Burpsuite证书导出有两种方法: 第一种方法 1、开启代理后直接在浏览器中输入burp下载CA证书 2、在中间证书颁发机构中导入刚导出的证书 3、导入完成后再把这个证书选择导出,另存为cer格式的文件 4、在受信任的根证书颁发机构中导入刚保存的cer格式证书…...
python保存文件到zip压缩包中
这里我们使用zipfile这个库进行操作,保存压缩文件相对简单,只需要指定文件名即可,不需要读取那个文件: with zipfile.ZipFile("zip文件路径", mode, zipfile.ZIP_DEFLATED) as z:z.write("压缩源文件路径", …...
java发送媒体类型为multipart/form-data的请求
文章目录 public static String sendMultipartFormDataPostRequest(String urlString, String data) throws IOException {String fullUrl urlString "?" data;log.info("完整请求路径为{}", fullUrl);URL url new URL(fullUrl);HttpURLConnection co…...

自定义类使用ArrayList中的remove
Java中ArrayList对基础类型和字符串类型的删除操作,直接用remove方法即可。但是对于自定义的类来说,用remove方法删除不了,因为没有办法确定是否是要删除的对象。 ArrayList中remove源码是: public boolean remove(Object o) {if…...
前端面试考核点【更持续新中】
文章目录 HTMLcssjsVueReactTypeScript移动端&小程序编译/打包/构建npmnodejs微前端网络安全浏览器性能OKR工程化、标准化 HTML Script放在body中间会阻塞吗?defer与async的区别?https://blog.csdn.net/qq_41887214/article/details/124909219 DOM和…...
linux-docker安装
TOC 一,Docker简介 百科说:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制&…...

如何用html css js 画出曲线 或者斜线;
效果图 解题思路 将图片全部定位至中心点,然后x轴就变动translateX ,y轴同理; 这里有两个问题 浏览器: 以左上角为原点0,0 越往下y越大 数学坐标系:以中心点为原点0,0 越往下y越小࿱…...
【错误记录】Uncaught TypeError: m.nodeName.toLowerCase is not a function
描述:在控制台输出上述错误~ 原因:在页面中,使用jQuery 开发时,命名不能和jQuery一起方法属性冲突,比如这里的nodeName,这里换一个不冲突的名字,就解决问题了。...

王颖奇:ONES.ai 上线,以及我的一些思考
ONES.ai 正式上线!为你解锁更智能、更高效的新一代研发管理体验 我们上线了 ONES.ai,当然我们用了公开的 LLM(AI),目前我们最方便使用的就是公开的 LLM,其实是不是 公开的 LLM 也不重要,在未来可预见的时间内ÿ…...
将AI技术与VR元宇宙相结合的整体解决方案
当前人工智能与VR虚拟现实两大热门技术的融合,正引领着人类走向更智能、更数字化、更便捷、更快速的时代。将这两者结合,AI智能检索应用到VR教学中,将为教育带来前所未有的好处。 个性化教学体验 通过AI智能检索,VR教学可以针对每…...
IPKISS Tutorials 3------绘制矩形版图
IPKISS Tutorials 3------绘制矩形版图 方法1------使用Rectangle函数模块导入与放置层设定创建PCell可视化版图这里给大家介绍一下如何在 IPKISS 绘制一个矩形结构的版图。 方法1------使用Rectangle函数 import si_fab.all as pdk import ipkiss3.all as i3class Box(i3.PC…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
WEB3全栈开发——面试专业技能点P7前端与链上集成
一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...