系列文章目录

第一章 Mongodb的主副本集


文章目录

  • 系列文章目录
  • 前言
  • 一、Mongodb基础介绍
      • 数据库(Database)
      • 集合(Collection)
      • 文档(Document)
      • BSON(Binary JSON)
      • _id(主键)
      • 索引(Index)
      • 分片(Sharding)
      • 副本集(Replica Set)
      • 聚合管道(Aggregation Pipeline)
      • CRUD 操作
      • 写关注(Write Concern)
      • 读偏好(Read Preference)
  • 二、Mongodb事务
      • 事务的基本概念
      • 启用事务的前提条件
      • 事务的使用方法
      • 事务的隔离级别
      • 事务的写关注
      • 事务的注意事项
      • 事务的性能优化
      • 事务的错误处理
      • 事务的限制
  • 三、Docker部署MongoDB主副本集
    • 环境准备
      • Docker安装
      • 具体安装
      • 验证
  • 小结


前言

公司有项目需要满足数据内容不固定,Mongodb更适合此业务,但是不支持事务,于是了解到主副本集可以满足。


一、Mongodb基础介绍

数据库(Database)

Mongodb 中的数据库是一组集合(Collection)的容器,每个数据库在文件系统中有独立的文件存储。数据库名称区分大小写,通常用于逻辑隔离不同应用或模块的数据。

集合(Collection)

集合是 Mongodb 中存储文档(Document)的容器,类似于关系型数据库中的表。集合不需要预先定义结构,可以动态存储不同格式的文档。集合名称同样区分大小写。

文档(Document)

文档是 Mongodb 中的数据基本单元,采用 BSON(Binary JSON)格式存储。文档由键值对组成,键是字符串,值可以是多种数据类型(如字符串、数字、数组、嵌套文档等)。例如:

{"name": "Alice","age": 30,"address": {"city": "New York","zip": "10001"}
}

BSON(Binary JSON)

BSON 是 JSON 的二进制编码格式,扩展了 JSON 的数据类型(如日期、二进制数据等)。Mongodb 使用 BSON 在内部存储和传输数据,支持高效查询和索引。

_id(主键)

每个文档必须包含一个唯一的 _id 字段作为主键。如果插入文档时未指定 _id,Mongodb 会自动生成一个 ObjectId 类型的值。_id 字段默认建立索引。

索引(Index)

索引用于加速查询性能,类似于关系型数据库的索引。Mongodb 支持单字段索引、复合索引、多键索引(数组字段)、全文索引等。例如创建索引的命令:

db.collection.createIndex({ "name": 1 }) // 1表示升序,-1表示降序

分片(Sharding)

分片是 Mongodb 的横向扩展机制,将数据分散到多个分片(Shard)上。每个分片是独立的数据库实例,共同组成一个逻辑数据库。分片通过分片键(Shard Key)路由数据。

副本集(Replica Set)

副本集是一组维护相同数据的 Mongodb 实例,提供高可用性。包含一个主节点(Primary)和多个从节点(Secondary)。主节点处理写操作,从节点同步数据并支持读操作。

聚合管道(Aggregation Pipeline)

聚合管道是数据处理框架,通过多个阶段(Stage)对文档进行转换和计算。每个阶段处理输入文档并输出结果到下一阶段。常见阶段包括 $match$group$sort 等。

CRUD 操作

CRUD 指 Mongodb 的基本数据操作:

  • CreateinsertOne()insertMany()
  • Readfind()findOne()
  • UpdateupdateOne()updateMany()
  • DeletedeleteOne()deleteMany()

写关注(Write Concern)

写关注定义写操作的确认级别,控制数据持久化的可靠性。例如:

db.collection.insertOne({ "key": "value" },{ writeConcern: { w: "majority", j: true } } // w: 写入节点数,j: 日志持久化
)

读偏好(Read Preference)

读偏好指定查询请求的路由规则,允许从主节点或从节点读取数据。选项包括 primarysecondarynearest 等,适用于读写分离场景。

二、Mongodb事务

事务的基本概念

MongoDB 从 4.0 版本开始支持多文档事务,适用于副本集;从 4.2 版本开始支持分片集群的事务。事务提供 ACID 特性,确保数据操作的原子性、一致性、隔离性和持久性。

启用事务的前提条件

MongoDB 事务需要运行在副本集或分片集群上,单机模式不支持事务。确保 MongoDB 实例已正确配置为副本集或分片集群。

事务的使用方法

在 MongoDB 中使用事务需要通过会话(Session)来管理。以下是一个基本的事务操作示例:

const session = db.getMongo().startSession();
session.startTransaction({readConcern: { level: "snapshot" },writeConcern: { w: "majority" }
});try {const collection1 = session.getDatabase("db1").collection1;const collection2 = session.getDatabase("db2").collection2;collection1.insertOne({ name: "Alice" }, { session });collection2.updateOne({ name: "Bob" }, { $set: { age: 30 } }, { session });session.commitTransaction();
} catch (error) {session.abortTransaction();throw error;
} finally {session.endSession();
}

事务的隔离级别

MongoDB 提供 snapshot 隔离级别,确保事务内读取的数据来自同一快照。可以通过 readConcern 设置:

readConcern: { level: "snapshot" }

事务的写关注

事务中的写操作可以通过 writeConcern 指定确认级别,通常设置为 majority 以确保数据持久性:

writeConcern: { w: "majority" }

事务的注意事项

事务中的操作必须显式指定会话(Session),否则操作不会包含在事务中。事务的执行时间不宜过长,避免锁竞争和性能问题。事务支持的文档操作包括插入、更新、删除和查询。

事务的性能优化

为了减少事务对性能的影响,尽量缩小事务范围,减少事务内的操作数量。避免在事务中执行耗时操作,如大规模数据扫描。合理设置事务超时时间,防止长时间占用资源。

事务的错误处理

事务执行过程中如果发生错误,必须捕获异常并显式调用 abortTransaction 回滚事务。确保事务结束后调用 endSession 释放会话资源。

事务的限制

MongoDB 事务不支持某些操作,如创建或删除集合、创建或删除索引。事务内的写操作不能影响分片键的值。单个事务的文档修改量默认限制为 16MB,超过会导致错误。


三、Docker部署MongoDB主副本集

环境准备

  • linux服务器,内存不少于8G,cpu至少I5,磁盘500G起步,这里我用的是CentOS7,架构是x86_64,通过如下命令确认

[root@host ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[root@host ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                16
On-line CPU(s) list:   0-15
Thread(s) per core:    2
Core(s) per socket:    8
座:                 1
NUMA 节点:         1
厂商 ID:           GenuineIntel
CPU 系列:          6
型号:              165
型号名称:        Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
步进:              5
CPU MHz:             800.048
CPU max MHz:           4800.0000
CPU min MHz:           800.0000
BogoMIPS:            5800.00
虚拟化:           VT-x
L1d 缓存:          32K
L1i 缓存:          32K
L2 缓存:           256K
L3 缓存:           16384K
NUMA 节点0 CPU:    0-15

Docker安装

看 欧拉系统部署Docker实践指南, 参考前面部分就行。

具体安装

  • 镜像用的是mongo最新版,可以直接拉取,也可以docker run时拉取
  • 这里配置3个,做1主两从
  • 新建目录,用于挂载存放配置文件
mkdir -p /home/mongodb  && chown -R 200 /home/mongodb
  • 确定主端口:27017,2个从分别是27018、27019
  • 命令列表

#自定义网络
docker network create --subnet=172.18.0.0/16 my-network
# 查看已存在网络
docker network ls
# mongo容器认证启动方式
docker run --restart=always --privileged -p 27017:27017 --name mongodbMaster --network my-network --ip 172.18.0.1 -v /home/mongo/mongoMaster/config:/data/configdb -v /home/mongo/mongoMaster/db:/data/db -v /home/mongo/mongoMaster/logs:/data/log -d mongo --replSet rs
docker run --restart=always --privileged -p 27018:27017 --name mongodbSlave1 --network my-network --ip 172.18.0.2 -v /home/mongo/mongoSlave1/config:/data/configdb -v /home/mongo/mongoSlave1/db:/data/db -v /home/mongo/mongoSlave1/logs:/data/log -d mongo --replSet rs
docker run --restart=always --privileged -p 27019:27017 --name mongodbSlave2 --network my-network --ip 172.18.0.3 -v /home/mongo/mongoSlave2/config:/data/configdb -v /home/mongo/mongoSlave2/db:/data/db -v /home/mongo/mongoSlave2/logs:/data/log -d mongo --replSet rs
  • 执行docker images | grep mongo, 发现3个容器已经创建并运行
  • 进入容器,创建账号、授权
docker exec -it mongodbMaster /bin/bash
进入MongoDB交互式命令行并切换到admin数据库
mongo
use admin
//管理员 
db.createUser({ user: 'rwuser', pwd: 'xxxxx', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
db.auth('rwuser', 'xxxxx') //返回1表示认证成功
db.getCollectionNames() //所有创建的用户都会存储在system.users集合中
//factory-dev
use factory-dev //切换到目标数据库
db.createUser({ user: 'test', pwd: 'xxxxx', roles: [ { role: "readWrite", db: "db1" } ] });
db.auth('test', 'xxxxx') //返回1表示认证成功# 查看主节点,找到members[].stateStr:主节点应为 "PRIMARY",说明ok。
rs:PRIMARY> rs.status()
{"set" : "rs","date" : ISODate("2025-09-04T00:32:31.156Z"),"myState" : 1,"term" : NumberLong(335),"syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"majorityVoteCount" : 2,"writeMajorityCount" : 2,"votingMembersCount" : 3,"writableVotingMembersCount" : 3,"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"lastCommittedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"readConcernMajorityOpTime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"appliedOpTime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"durableOpTime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"lastAppliedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastDurableWallTime" : ISODate("2025-09-04T00:32:25.880Z")},"lastStableRecoveryTimestamp" : Timestamp(1756945915, 1),"electionCandidateMetrics" : {"lastElectionReason" : "electionTimeout","lastElectionDate" : ISODate("2025-09-03T06:59:13.712Z"),"electionTerm" : NumberLong(335),"lastCommittedOpTimeAtElection" : {"ts" : Timestamp(1756882537, 1),"t" : NumberLong(334)},"lastSeenOpTimeAtElection" : {"ts" : Timestamp(1756882547, 1),"t" : NumberLong(334)},"numVotesNeeded" : 2,"priorityAtElection" : 1,"electionTimeoutMillis" : NumberLong(10000),"numCatchUpOps" : NumberLong(0),"newTermStartDate" : ISODate("2025-09-03T06:59:13.799Z"),"wMajorityWriteAvailabilityDate" : ISODate("2025-09-03T06:59:14.450Z")},"electionParticipantMetrics" : {"votedForCandidate" : true,"electionTerm" : NumberLong(333),"lastVoteDate" : ISODate("2025-09-03T06:54:18.247Z"),"electionCandidateMemberId" : 2,"voteReason" : "","lastAppliedOpTimeAtElection" : {"ts" : Timestamp(1756882339, 1),"t" : NumberLong(331)},"maxAppliedOpTimeInSet" : {"ts" : Timestamp(1756882339, 1),"t" : NumberLong(331)},"priorityAtElection" : 1},"members" : [{"_id" : 0,"name" : "f1737b1cbbc5:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 63539,"optime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDate" : ISODate("2025-09-04T00:32:25Z"),"lastAppliedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastDurableWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1756882753, 1),"electionDate" : ISODate("2025-09-03T06:59:13Z"),"configVersion" : 5,"configTerm" : 335,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 1,"name" : "172.18.0.1:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 63207,"optime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDurable" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDate" : ISODate("2025-09-04T00:32:25Z"),"optimeDurableDate" : ISODate("2025-09-04T00:32:25Z"),"lastAppliedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastDurableWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastHeartbeat" : ISODate("2025-09-04T00:32:31.006Z"),"lastHeartbeatRecv" : ISODate("2025-09-04T00:32:31.009Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncSourceHost" : "f1737b1cbbc5:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 5,"configTerm" : 335},{"_id" : 2,"name" : "172.18.0.2:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 63206,"optime" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDurable" : {"ts" : Timestamp(1756945945, 1),"t" : NumberLong(335)},"optimeDate" : ISODate("2025-09-04T00:32:25Z"),"optimeDurableDate" : ISODate("2025-09-04T00:32:25Z"),"lastAppliedWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastDurableWallTime" : ISODate("2025-09-04T00:32:25.880Z"),"lastHeartbeat" : ISODate("2025-09-04T00:32:31.009Z"),"lastHeartbeatRecv" : ISODate("2025-09-04T00:32:31.006Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncSourceHost" : "f1737b1cbbc5:27017","syncSourceId" : 0,"infoMessage" : "","configVersion" : 5,"configTerm" : 335}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1756945945, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1756945945, 1)
}
  • 一定要注意mongoDB重启顺序:docker start mongodbMaster,docker start mongodbSlave1,docker start mongodbSlave2
    先启动mongodbMaster那个就会成为PRIMARY,也是可以读写的,其他的都是副本集,属于SECONDARY,只能读

验证

  • 使用Navicat数据库连接工具,点击连接,选择monogb
    连接

  • 输入ip 端口,账号、密码、数据库名,这里端口填写主端口27017,最后点击一下"测试连接",返回OK说明配置连接成功。
    填配

  • 右键新一个数据库test
    数据库

  • 选择集合,新建一个集合demo1
    新建集合

  • 建表SQL,我这里用的是脚本执行的

// ----------------------------
// Collection structure for autoId
// ----------------------------
db.getCollection("demo1").drop();
db.createCollection("demo1");// ----------------------------
// Documents of autoId
// ----------------------------
db.getCollection("demo1").insert([ {_id: "6394049da732a862951f5a62",    autoId: NumberInt("1288641"),collectionName: "product"
} ]);

执行脚本

  • 插入成功后,效果如下
    查询

  • 事务验证这块,因为使用的代码验证的,你们只能自行用代码验证了,方法很简单,开启事务后,先执行一个插入,再制造一个异常,比如 1/0, 看数据是否回滚。


小结

  • 遇到无法写入数据时,先进入任何一个容器
    比如 docker exec -it mongodbMaster /bin/bash
    mongo
    rs.status();
    查看
    members[].stateStr:主节点应为 “PRIMARY”。
    members[].health:健康节点值为 1。
    若都为SECONDARY,说明还没有确定谁是PRIMARY,先等一会再执行看看是否有PRIMARY,有的那个就是可以连接和读写的容器
    若一直都是SECONDARY,就要检查容器情况了。

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

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

相关文章

FC平台安装Windows Server2016并连接V6存储

创建 windows server2016 上传ISO创建虚拟机安装OS 加载光盘挂载成功之后,重启虚拟机重启之后VNC登录即可。在FC上安装windows,安装完成后,必须安装tools工具,不然没有虚拟网卡,无法配置ip地址。Windows主机安装toolsW…

农业XR数字融合工作站,赋能农业专业实践学习

随着数字技术与农业的深度融合,农业专业XR数字融合工作站为农业专业学生提供了沉浸式、交互式的学习体验。农业专业XR数字融合工作站作为集PC、VR、MR技术于一体的软硬件集成平台,通过虚拟仿真、数字孪生等技术手段,有效解决了传统农业教育中…

积分球的使用——简易版

这篇写的比较杂。积分球的功能积分球——测量灯具等光源的总光通量、光效、色温、显色指数等参数。使用方法1.开启积分球系统(探测器、光度计、光谱仪),充分预热(15-30分钟),使得电子设备稳定,减…

[光学原理与应用-435]:晶体光学 - 晶体的结构-基元/原胞/晶胞/点阵

晶体的结构可通过基元、原胞、晶胞和点阵四个核心概念进行系统描述,它们共同揭示了晶体中原子排列的周期性与对称性规律,具体如下:1. 基元(Structure Motif)定义:基元是晶体中重复排列的最小结构单元&#…

电脑音频录制 | 系统麦克混录 / 系统声卡直录 | 方法汇总 / 常见问题

注:本文为 “电脑音频录制 ” 相关合辑。 英文引文,机翻未校。 未整理去重,如有内容异常,请看原文。 How to Record Computer Audio in 6 Free Ways 如何用 6 种免费方式录制电脑音频 Sponsored by EaseUS Nov 28, 2023 4:34 a…

2025高教社国赛数学建模竞赛B题完整参考论文(含模型和代码)

2025国赛数学建模竞赛B题完整参考论文 目录 一、 问题重述 1.1 问题背景 1.2 问题回顾与分析 二、 模型假设 三、 符号说明 四、 问题求解与分析 4.1数据预处理 4.2 问题1求解与分析 4.2.1 问题1分析 4.2.2 问题1建模与求解 4.2.3 问题1结果与分析 4.3 问题2求解与分…

OpenSSL 1.0.1e 下载解压和运行方法(小白适用 附安装包)​

openssl-1.0.1e.zip​ 是 OpenSSL 加密工具包的一个旧版本(发布于 2013 年左右)的 ​源代码压缩包,文件格式是 ZIP 压缩格式。 一、下载与解压 ​下载文件​ 假如你已经有了 openssl-1.0.1e.zip 这个压缩包,就跳过这步。 如果没有…

MapStruct详解

提到属性拷贝,首先想到的BeanUtils。 先简单的回忆下BeanUtils,处理Java Bean之间的属性拷贝;不过由于它是通过反射来拷贝属性,在数据量大一些的时候性能会降低; 且在安全方面也会比较弱; MapStruct是编译期…

8.FC平台模块梳理

文章目录8.FC平台模块梳理8.1. 内存复用技术特点应用价值8.2. 虚拟机启用策略8.3. NUMA8.4. HA高可用8.5. 故障和响应策略8.6. DRS 和 DPM8.7. IMC8.FC平台模块梳理 8.1. 内存复用 内存共享内存交换内存气泡 内存共享:多台虚拟机共享数据内容相同的内存页。内存交换…

贪心算法应用:DNA自组装问题详解

JAVA中的贪心算法应用:DNA自组装问题详解 1. DNA自组装问题概述 DNA自组装(DNA Self-Assembly)是分子计算和纳米技术中的一个重要问题,它利用DNA分子的互补配对特性,通过精心设计DNA序列,使其自发地组装成预定的纳米结构。在计算机…

数据湖如何打造统一存储与处理方案(结构化数据、半结构化数据和非结构化数据)

目录 1. 数据湖的“包容哲学”:为什么需要统一方案? 数据湖的核心诉求 案例:零售企业的痛点 2. 存储层设计:给数据找个舒适的家 分区与分层存储 选择存储格式 案例:Parquet的威力 云存储的选择 3. 元数据管理:给数据湖装上“导航仪” 元数据管理的核心组件 主流…

AUTOSAR进阶图解==>AUTOSAR_SWS_TTCANDriver

TTCAN驱动器详细规范 AUTOSAR TTCAN Driver Specification with Enhanced Visual Documentation目录 1. 概述2. TTCAN控制器状态机3. TTCAN模块架构4. TTCAN时间触发操作序列5. TTCAN错误处理流程6. 总结 1. 概述 TTCAN(Time-Triggered CAN)驱动器是AU…

equals 定义不一致导致list contains错误

错误代码如下&#xff1a;for (int i0;i< rows.size();i) {Row r rows.get(i);if (r.equals(row)) {assertTrue(rows.contains(row));return;}}cassertTrue(rows.contains(row));返回了false&#xff0c;看起来很奇怪&#xff0c;此时equals 定义如下&#xff1a;public bo…

【Python基础】 20 Rust 与 Python 循环语句完整对比笔记

一、基本循环结构对比 Rust 循环类型 // 1. loop - 无限循环 let mut count 0; loop {count 1;if count > 5 {break;} }// 2. while - 条件循环 let mut number 3; while number ! 0 {println!("{}!", number);number - 1; }// 3. for - 迭代循环 for i in 0..…

Redis 在互联网高并发场景下的应用--个人总结

在现代互联网系统中&#xff0c;高并发已经成为常态。无论是电商的秒杀场景、社交平台的热点推荐&#xff0c;还是支付接口的风控&#xff0c;系统需要同时应对成千上万的请求。这时候&#xff0c;Redis 作为一个高性能的内存数据库&#xff0c;凭借其极快的读写速度和丰富的数…

C++笔记之软件设计原则总结

C++笔记之软件设计原则总结 code review 文章目录 C++笔记之软件设计原则总结 1.软件设计的六大原则 2.高内聚与低耦合 2.1.高内聚(High Cohesion) 2.2.低耦合(Low Coupling) 2.3.高内聚与低耦合的关系与重要性 3.DRY(Dont Repeat Yourself)原则 3.1.定义 3.2.好处 3.3.示…

ThreadLocal 深度解析:原理、应用场景与最佳实践

一、ThreadLocal 核心概念与设计哲学​1.1 ThreadLocal 的基本概念​ThreadLocal 是 Java 中提供线程局部变量的类&#xff0c;它允许每个线程创建自己的变量副本&#xff0c;从而实现线程封闭&#xff08;Thread Confinement&#xff09;。简单来说&#xff0c;ThreadLocal 为…

AMD显卡运行GPT-OSS全攻略

AMD显卡运行GPT-OSS全攻略 本文介绍如何在Windows系统上使用AMD显卡&#xff08;以RX 7900XTX为例&#xff09;运行开源GPT-OSS模型。 前置要求 硬件&#xff1a;AMD显卡&#xff08;如RX 7900XTX&#xff0c;具体支持型号参考ROCm文档&#xff09;。软件&#xff1a; Ollam…

【Sharding-JDBC】​Spring/Spring Boot 集成 Sharding-JDBC,分表策略与 API、YAML 配置实践​

文章目录环境准备Spring框架Sharding-JDBC 4.x版本api实现Sharding-JDBC 5.4.x版本yaml实现Springboot框架Sharding-JDBC 5.4.x版本yaml实现分库、加密、读写分离基于yaml的配置示例更多相关内容可查看需求&#xff1a;按月分区&#xff0c;按年分表&#xff0c;找不到对应年份…

单片机和PLC有哪些区别?揭秘单片机MCU的常见应用

单片机&#xff08;MCU&#xff09;和可编程逻辑控制器&#xff08;PLC&#xff09;作为电子控制系统中的两大核心组件&#xff0c;分别在不同的领域发挥着重要作用。然而&#xff0c;尽管它们都属于自动化控制领域的关键设备&#xff0c;但它们的设计理念、应用场景和性能特点…