当前位置: 首页 > news >正文

Spring Boot 中如何启用 MongoDB 事务

在 Spring Boot 中启用和使用 MongoDB 事务主要依赖于以下几个方面:

  1. MongoDB 服务器和部署模式

    • MongoDB 版本 4.0 或更高版本才支持副本集 (Replica Set) 上的多文档 ACID 事务。
    • MongoDB 版本 4.2 或更高版本才支持分片集群 (Sharded Cluster) 上的多文档 ACID 事务。
    • Standalone (单节点) 模式不支持多文档事务。 MongoDB 实例必须是副本集或分片集群的一部分。
  2. Spring Boot 和 Spring Data MongoDB 版本

    • 确保使用的 Spring Boot 版本(以及它所管理的 Spring Data MongoDB 版本)支持 MongoDB 事务。较新的 Spring Boot 版本(2.1.x 及以后)都提供了良好的支持。
    • spring-boot-starter-data-mongodb 依赖是必需的。
  3. 配置 MongoTransactionManager

    • Spring Boot 会在检测到合适的条件时(例如,连接 URI 指向一个副本集)自动配置 MongoTransactionManager
  4. 使用 @Transactional 注解

    • 这是在 Spring 中管理事务的标准方式。

下面是如何在 Spring Boot 中启用和使用 MongoDB 事务:

步骤 1: 确保 MongoDB 环境支持事务

  • 确认MongoDB 服务器版本(4.0+ for replica sets, 4.2+ for sharded clusters)。
  • 确认MongoDB 是以副本集或分片集群模式运行。

步骤 2: 添加依赖

在你的 pom.xml (Maven) 或 build.gradle (Gradle) 文件中,确保有 Spring Data MongoDB 的 starter:

Maven (pom.xml):

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

步骤 3: 配置数据库连接 URI

application.propertiesapplication.yml 中配置 MongoDB 连接 URI。关键是要包含 replicaSet 参数(如果你的 MongoDB 是副本集)。

application.properties:

spring.data.mongodb.uri=mongodb://localhost:27017,localhost:27018,localhost:27019/mydatabase?replicaSet=rs0
# 或者对于分片集群,连接到 mongos 实例
# spring.data.mongodb.uri=mongodb://mongos1:27017,mongos2:27017/mydatabase
  • localhost:27017,localhost:27018,localhost:27019:副本集成员地址。
  • mydatabase:数据库名称。
  • replicaSet=rs0:副本集名称。这个参数对于 Spring Boot 自动配置 MongoTransactionManager 非常重要。

步骤 4: 启用事务管理器

a) 自动配置 (推荐)

如果 spring.data.mongodb.uri 正确配置了 replicaSet 参数(或者连接的是分片集群的 mongos),Spring Boot 通常会自动为你配置一个 MongoTransactionManager bean。不需要额外做配置。

b) 手动配置 (如果自动配置不生效或需要自定义)

如果需要手动配置,可以在配置类中创建一个 MongoTransactionManager bean:

import com.mongodb.client.MongoClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.MongoTransactionManager;
import org.springframework.data.mongodb.core.MongoTemplate; // 仅为示例,非必需@Configuration
public class MongoConfig {// Spring Boot 会自动配置 MongoDatabaseFactory// 你只需要注入它来创建 MongoTransactionManager@BeanMongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {return new MongoTransactionManager(dbFactory);}// 可选: 如果你也想配置一个 MongoTemplate bean// @Bean// public MongoTemplate mongoTemplate(MongoDatabaseFactory dbFactory, MongoClient mongoClient) {//     return new MongoTemplate(mongoClient, dbFactory.getMongoDatabase().getName());// }
}

注意: 通常情况下,如果你的 URI 配置正确,Spring Boot 的自动配置就足够了,你不需要手动创建这个 bean。

步骤 5: 在 Service 层使用 @Transactional

现在可以在Service 方法上使用 Spring 的 @Transactional 注解来声明事务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; // Spring的事务注解
import com.mongodb.MongoException; // 更通用的MongoDB异常
import com.mongodb.MongoTransactionException; // 事务特定异常@Service
public class AccountService {@Autowiredprivate AccountRepository accountRepository; // 假设你有一个 AccountRepository@Autowiredprivate AuditLogRepository auditLogRepository; // 假设你有一个 AuditLogRepository/*** 示例:在一个事务中转账并记录日志* 如果任何一步失败,整个操作将回滚*/@Transactional // 关键注解public void transferMoney(String fromAccountId, String toAccountId, double amount) {try {Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow(() -> new RuntimeException("Source account not found"));Account toAccount = accountRepository.findById(toAccountId).orElseThrow(() -> new RuntimeException("Destination account not found"));if (fromAccount.getBalance() < amount) {throw new RuntimeException("Insufficient funds");}fromAccount.setBalance(fromAccount.getBalance() - amount);toAccount.setBalance(toAccount.getBalance() + amount);accountRepository.save(fromAccount);// 模拟一个可能发生的错误,以测试回滚// if (true) {//     throw new RuntimeException("Simulated error during transfer!");// }accountRepository.save(toAccount);// 记录审计日志AuditLog log = new AuditLog("Transfer of " + amount + " from " + fromAccountId + " to " + toAccountId);auditLogRepository.save(log);System.out.println("Transfer successful and logged!");} catch (RuntimeException e) {// @Transactional 会在 RuntimeException 抛出时自动回滚// 你可以在这里记录错误,但不需要手动回滚System.err.println("Transfer failed: " + e.getMessage());throw e; // 重新抛出,以便 Spring 能够捕获并回滚事务}}/*** 示例:只读事务* 对于只需要读取数据的操作,可以标记为只读,这可能有一些性能优化。*/@Transactional(readOnly = true)public Account getAccountDetails(String accountId) {return accountRepository.findById(accountId).orElse(null);}// 假设的实体和仓库// Account.java, AuditLog.java// AccountRepository.java extends MongoRepository<Account, String>// AuditLogRepository.java extends MongoRepository<AuditLog, String>
}

工作原理:

  1. 当调用被 @Transactional 注解的方法时,Spring 会启动一个 MongoDB 事务(通过 MongoTransactionManager)。
  2. 方法内的所有数据库操作(例如 repository.save())都会在这个事务的上下文中执行。
  3. 如果方法成功完成(没有抛出未被捕获的 RuntimeExceptionError),事务将被提交。
  4. 如果方法抛出任何未被捕获的 RuntimeExceptionError(默认行为),事务将被回滚。受检异常(Checked Exceptions)默认不会触发回滚,除非通过 @Transactional(rollbackFor = SpecificCheckedException.class) 特别指定。

步骤 6: 异常处理和重试 (重要!)

MongoDB 事务可能会因为写冲突 (write conflicts) 而中止。当两个并发事务尝试修改同一个文档时,就会发生这种情况。MongoDB 会中止其中一个事务,并抛出 MongoTransactionException (通常是其子类,如 MongoWriteConflictException)。

在应用程序中必须捕获这些异常并重试整个事务。

// 在调用方或者一个更高层次的Service
@Service
public class TransactionalCallerService {@Autowiredprivate AccountService accountService;private static final int MAX_RETRIES = 3;public void performTransferWithRetry(String from, String to, double amount) {int retries = 0;boolean success = false;while (retries < MAX_RETRIES && !success) {try {accountService.transferMoney(from, to, amount);success = true; // 如果没有异常,标记成功} catch (MongoTransactionException e) { // 捕获事务相关的异常,特别是写冲突retries++;System.err.println("Transaction failed due to conflict, retrying (" + retries + "/" + MAX_RETRIES + "): " + e.getMessage());if (retries >= MAX_RETRIES) {System.err.println("Max retries reached. Transfer aborted.");throw e; // 或者抛出一个自定义的业务异常}// 可以考虑在此处添加短暂的延迟try {Thread.sleep(100 * retries); // 简单的指数退避} catch (InterruptedException ie) {Thread.currentThread().interrupt();throw new RuntimeException("Retry interrupted", ie);}} catch (RuntimeException e) { // 捕获其他业务逻辑异常System.err.println("Transfer failed due to business error: " + e.getMessage());throw e; // 这些通常不需要重试}}}
}

总结关键点:

  • MongoDB 环境: 确保是副本集 (4.0+) 或分片集群 (4.2+)。
  • URI 配置: 在 spring.data.mongodb.uri 中正确设置 replicaSet 参数。
  • MongoTransactionManager: 通常由 Spring Boot 自动配置。
  • @Transactional: 在 Service 方法上使用。
  • 异常处理: 必须处理 MongoTransactionException 并实现重试逻辑以应对写冲突。
  • 事务范围: 尽量保持事务简短,避免长时间运行的事务。
  • 非事务操作: 某些 MongoDB 操作(如创建集合、创建索引)不在事务内执行或在事务内有特定行为。

通过这些步骤,我们就可以在 Spring Boot 应用程序中有效的使用 MongoDB 的多文档 ACID 事务了。

相关文章:

Spring Boot 中如何启用 MongoDB 事务

在 Spring Boot 中启用和使用 MongoDB 事务主要依赖于以下几个方面&#xff1a; MongoDB 服务器和部署模式&#xff1a; MongoDB 版本 4.0 或更高版本才支持副本集 (Replica Set) 上的多文档 ACID 事务。MongoDB 版本 4.2 或更高版本才支持分片集群 (Sharded Cluster) 上的多文…...

2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业​​认证

2025年5月5日前 免费考试了&#xff01; Oracle AI 矢量搜索专业​​认证 立刻预约吧 文章目录 2025年5月5日前 免费考试了&#xff01; Oracle AI 矢量搜索专业​​认证立刻预约吧&#x1f50d; 探索 AI 向量搜索的强大功能&#xff01;&#x1f3af; 学习路径目标&#x1f6e…...

初等数论--莫比乌斯反演

1. 定义 假设 f ( n ) g ( n ) f(n)\ g(n) f(n) g(n)是定义在正整数上的两个函数 &#xff0c;且 f ( n ) ∑ d ∣ n g ( d ) ∑ d ∣ n g ( n d ) f(n)\sum_{d|n}g(d)\sum_{d|n}g(\frac{n}{d}) f(n)d∣n∑​g(d)d∣n∑​g(dn​) 那么 g ( n ) ∑ d ∣ n μ ( d ) f ( n d…...

访问者模式(Visitor Pattern)详解

文章目录 1. 访问者模式概述1.1 定义1.2 基本思想2. 访问者模式的结构3. 访问者模式的UML类图4. 访问者模式的工作原理5. Java实现示例5.1 基本实现示例5.2 访问者模式处理复杂对象层次结构5.3 访问者模式在文件系统中的应用6. 访问者模式的优缺点6.1 优点6.2 缺点7. 访问者模式…...

C++ 关联式容器:map,multimap,set,multiset

目录 引言 一、关联式容器概述 1.1 与序列式容器的区别 1.2 底层结构 二、set容器详解set介绍 2.1 set的特性 2.2 set的模板参数 2.3 set的常用接口 2.4 set使用示例 三、map容器详解map介绍 3.1 map的特性 3.2 map的模板参数 3.3 map的常用接口 3.4 map使用示例 …...

Discriminative and domain invariant subspace alignment for visual tasks

用于视觉任务的判别性和域不变子空间对齐 作者&#xff1a;Samaneh Rezaei&#xff0c;Jafar Tahmoresnezhad 文章于2018年12月4日收到&#xff0c;2019年5月24日被接受&#xff0c;2019年6月3日在线发表于Iran Journal of Computer Science期刊&#xff0c;DOI: 10.1007/s42…...

comfyui 如何优雅的从Hugging Face 下载模型,文件夹

如下图所示 使用git 下载整个仓库然后把需要的放到对应的位置...

【C++】 —— 笔试刷题day_27

一、kotori和气球 题目解析 这道题&#xff0c;有n中气球&#xff0c;每一种气球有无数多个&#xff1b;现在我们需要将这些气球摆成一排&#xff0c;但是&#xff0c;如果相邻的气球是相同的就会发生爆炸&#xff08;也就是说&#xff0c;相同的气球相邻的摆法是不合法的&…...

2025年“深圳杯”数学建模挑战赛C题国奖大佬万字思路助攻

完整版1.5万字论文思路和Python代码下载&#xff1a;https://www.jdmm.cc/file/2712073/ 引言 本题目旨在分析分布式能源 (Distributed Generation, DG) 接入配电网系统后带来的风险。核心风险评估公式为&#xff1a; R P_{loss} \times C_{loss} P_{over} \times C_{over}…...

大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调

文章目录 一、简介二、如何安装2.1 安装2.2 校验 三、开始使用3.1 可视化界面3.2 使用命令行3.2.1 模型微调训练3.2.2 模型合并3.2.3 模型推理3.2.4 模型评估 四、高级功能4.1 分布训练4.2 DeepSpeed4.2.1 单机多卡4.2.2 多机多卡 五、日志分析 一、简介 LLaMA-Factory 是一个…...

游戏引擎学习第268天:合并调试链表与分组

回顾并为今天的内容设定基调 我们正在直播中开发完整的游戏&#xff0c;目前调试系统的开发已接近尾声。这个调试系统的构建过程经历了较长的时间&#xff0c;中间还暂停过一段时间去做硬件渲染路径的开发&#xff0c;并在已有的软件渲染路径基础上进行了扩展。后来我们又回到…...

【Linux系统编程】进程属性--标识符

1.PID 1.1什么是PID&#xff1f; 区分进程的唯一性 1.2如何查看进程&#xff1f; ps ajx | head -1 ; ps ajx | grep myproc 或者ps ajx | head -1 && ps ajx | grep myproc | grep -v grep&#xff08;过滤掉grep本身这个进程&#xff09; 1.3进程有哪两种&#…...

React文档-State数据扁平化

1、选择 State 结构 思考一下&#xff1a; 如果渲染列表&#xff0c; 并更新列表数据在下面展示~ state 过去常常是这样复制的&#xff1a; items [{ id: 0, title: pretzels}, ...]selectedItem {id: 0, title: pretzels} 改了之后是这样的&#xff1a;items [{ id: 0, …...

kotlin flow防抖

一 防抖设计 ✅ 1. 点击事件的防抖&#xff1a;用于防止频繁触发逻辑 &#x1f3af; 适用场景&#xff1a; 用户连续快速点击按钮&#xff0c;可能会导致多次发送网络请求、CAN 指令或反复切换状态等副作用。所以我们通常在点击函数中处理防抖&#xff0c;例如&#xff1a; …...

基础语法(二)

Mysql基础语法&#xff08;二&#xff09; Mysql基础语法&#xff08;二&#xff09;主要介绍Mysql中稍微进阶一点的内容&#xff0c;会稍微有一些难度&#xff08;博主个人认为&#xff09;。学习完基础语法&#xff08;一&#xff09;和基础语法&#xff08;二&#xff09;之…...

FreeTex v0.2.0:功能升级/支持Mac

概述 FreeTex在发布之后&#xff0c;迎来很多反馈&#xff0c;本次根据主流的反馈建议&#xff0c;又进行一轮小升级&#xff0c;正式发布v0.2.0版本&#xff0c;主要升级点如下&#xff1a; 新增识别结果预览显示 Latex识别结果支持格式化输出 软件体积更小&#xff0c;并移…...

MacOS 用brew 安装、配置、启动Redis

MacOS 用brew 安装、配置、启动Redis 一、安装 brew install redis 二、启动 brew services start redis 三、用命令行检测 set name tom get name...

大型旋转机械信号分解算法模块

大型旋转机械信号分解算法模块&#xff0c;作为信号处理算法工具箱的主要功能模块&#xff0c;可应用于各类关键机械部件&#xff08;轴承、齿轮、转子、联轴器等&#xff09;的信号分析、故障探测、趋势劣化评估等&#xff0c;采用全Python语言&#xff0c;以B/S模式&#xff…...

Java 中的数据类型误导点!!!

在 Java 中&#xff0c;数据类型分为两大类&#xff1a;基本类型&#xff08;Primitive Types&#xff09; 和 引用类型&#xff08;Reference Types&#xff09;。它们的存储方式和行为完全不同。 1. 基本类型 Java 有 8 种基本数据类型&#xff0c;它们直接存储值&#xff…...

Linux--JsonCpp

1.JsonCpp 简介 JsonCpp 是一个用于 C 的 JSON 解析和生成库&#xff0c;支持 JSON 数据的读写、解析和序列化。它提供了简单的 API 来操作 JSON 对象、数组、字符串、数字等类型&#xff0c;是 C 开发中处理 JSON 数据的常用工具。 核心功能与类 JsonCpp 主要包含以下核心类…...

cv_connection (像halcon一样对区域进行打散)

主题&#xff1a; 分享一个自己用opencv写的小方法&#xff0c; 可以像halcon的connection算子一样&#xff0c; 对cv2.threshold得到的region进行打散&#xff0c; 并返回一个打散后的不相连的region的列表。 代码如下 def cv_connection(region):# he的拓扑信息为 后一…...

ConcurrentHashMap和锁

文章目录 JDK1.7的分段锁JDK1.8的volatileCAS synchronized可重入锁公平锁和非公平锁悲观锁和乐观锁 JDK1.7的分段锁 数据结构&#xff1a;数组&#xff08;大数组 Segment 和小数组 HashEntry&#xff09;链表 #mermaid-svg-dfSgz5E7tBmTbx14 {font-family:"trebuchet …...

黑马k8s(二)

集群环境搭建 1.环境规划 2.环境搭建-主机安装 主节点&#xff1a; 软件选择选择 基础设施服务器&#xff0c;这样安装系统完毕之后&#xff0c;会有很多软件我们可以直接使用了 系统点开&#xff0c;点一下完成 ip地址的设置&#xff1a;要跟虚拟网络编辑器&#xff0c;Net…...

LeetCode热题100--240.搜索二维矩阵--中等

1. 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[1…...

python校园新闻发布管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

Spring MVC 视图解析器 (ViewResolver) 如何配置? Spring Boot 是如何自动配置常见视图解析器的?

我们来详细分析一下视图解析器 (ViewResolver) 的配置以及 Spring Boot 是如何自动配置它们的。 视图解析器 (ViewResolver) 是什么&#xff1f; 在 Spring MVC 中&#xff0c;当控制器 (Controller) 方法处理完请求并返回一个逻辑视图名 (String) 时&#xff0c;DispatcherS…...

LeetCode 2918.数组的最小相等和:if-else

【LetMeFly】2918.数组的最小相等和&#xff1a;if-else 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-equal-sum-of-two-arrays-after-replacing-zeros/ 给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正…...

C++修炼:stack和queue

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…...

欧拉计划 Project Euler 69(欧拉总计函数与最大值)题解

欧拉计划 Project Euler 69 题解 题干欧拉总计函数与最大值 思路code 题干 欧拉总计函数与最大值 小于 n n n且与 n n n互质的正整数的数量记为欧拉总计函数 φ ( n ) \varphi(n) φ(n)&#xff0c;例如&#xff0c; 1 、 2 、 4 、 5 、 7 1、2、4、5、7 1、2、4、5、7和 8 …...

TCP Socket编程

最基本的Socket编程 想客户端和服务器能在网络中通信&#xff0c;就得使用 Socket 编程&#xff0c;它可以进行跨主机间通信。在创建Socket时可以选择传输层使用TCP还是UDP。相对于TCP来说&#xff0c;UDP更为简单&#xff0c;下面以TCP为例。 TCP服务端要先建立起来&#xf…...

[CLS] 向量是 BERT 类模型中一个特别重要的输出向量,它代表整个句子或文本的全局语义信息

[CLS] 向量是 BERT 类模型中一个特别重要的输出向量&#xff0c;它代表整个句子或文本的全局语义信息。 ✅ 什么是 [CLS] 在 BERT 模型中&#xff0c;每条输入前会加一个特殊的 token&#xff1a;[CLS]&#xff08;classification 的缩写&#xff09;。这个 token 没有具体语义…...

47.电压跌落与瞬时中断干扰的防护改善措施

电压跌落与瞬时中断干扰的防护改善措施 1. 电压跌落与瞬时中断的影响机理2. 解决措施 1. 电压跌落与瞬时中断的影响机理 跌落发生的常见场景如下&#xff1a; &#xff08;1&#xff09;电源插头接触不良&#xff0c;瞬态中断即刻恢复&#xff1b; &#xff08;2&#xff09;电…...

LeetCode热题100 两数之和

目录 两数之和题目解析方法一暴力求解代码 方法二哈希代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语言 &#x1f43f;️&#x1f43f;️&#x1f43f;…...

【无标题】I/O复用(epoll)三者区别▲

一、SOCKET-IO复用技术 定义&#xff1a;SOCKET - IO复用技术是一种高效处理多个套接字&#xff08;socket&#xff09;的手段&#xff0c;能让单个线程同时监听多个文件描述符&#xff08;如套接字&#xff09;上的I/O事件&#xff08;像可读、可写、异常&#xff09;&#x…...

【数据结构】子串、前缀

子串 (Substring) 字符串中连续的一段字符序列&#xff0c;例如 "abc" 是 "abcd" 的子串。 特点&#xff1a;必须连续&#xff0c;顺序不可改变。 子序列 (Subsequence) 字符串中不连续但保持顺序的字符序列&#xff0c;例如 "acd" 是 "…...

[docker基础四]容器虚拟化基础之 LXC

目录 一 认识LXC 二 LXC容器操作实战 1&#xff09;实战目的 2&#xff09;基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3&#xff09;安装LXC(我的是Ubuntu) 4&#xff09;操作实战 1. 检查 lxc 是否运行…...

leetcode 2918. 数组的最小相等和 中等

给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正整数&#xff0c;并且满足两个数组中所有元素的和 相等 。 返回 最小 相等和 &#xff0c;如果无法使两数组相等&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xf…...

RT-Thread 深入系列 Part 5:物联网与网络应用实战

摘要 本文聚焦 RT-Thread 在物联网场景下的网络应用实战,从网络协议栈集成到 MQTT/CoAP/HTTP 客户端实现,再到 mbedTLS 安全通信与 OTA 升级,最后以阿里云、腾讯云和 OneNet 平台对接为案例,完整呈现端到端的物联网解决方案落地过程。 目录 网络协议栈:LWIP 与网络设备 MQ…...

onGAU:简化的生成式 AI UI界面,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。

​一、软件介绍 文末提供程序和源码下载 onGAU&#xff1a;简化的生成式 AI UI界面开源程序&#xff0c;一个非常简单的 AI 图像生成器 UI 界面&#xff0c;使用 Dear PyGui 和 Diffusers 构建。 二、Installation 安装 文末下载后解压缩 Run install.py with python to setup…...

Linux系统入门第十二章 --Shell编程之正则表达式

一、正则表达式 之前学习了 Shell 脚本的基础用法&#xff0c;已经可以利用条件判断、循环等语句编辑 Shell脚本。接下来我们将开始介绍一个很重要的概念-正则表达式(RegularExpression&#xff0c;RE) 1.正则表达式的定义 正则表达式又称正规表达式、常规表达式。在代码中常…...

Ubuntu22.04怎么退出Emergency Mode(紧急模式)

1.使用nano /etc/fstab命令进入fstab文件下&#xff1b; 2.将挂载项首行加#注释掉&#xff0c;修改完之后使用ctrlX退出; 3.重启即可退出紧急模式&#xff01;...

IC ATE集成电路测试学习——开尔文连接

首先&#xff0c;我们先了解一下ATE在测试时的PMU测量原理。 驱动线路和感知线路 为了提升 PMU 驱动电压的精确度&#xff0c;常使用 4 条线路的结构&#xff1a;两条驱动线路传输电流&#xff0c;另两条感知线路监测我们感兴趣的点&#xff08;通常是DUT&#xff09;的电压。…...

Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程

Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程 摘要 本技术指南针对Ubuntu与Windows双系统用户&#xff0c;系统阐述NTFS分区挂载的技术原理与操作流程。通过规范的技术说明和专业的故障排除方案&#xff0c;帮助用户在异构操作系统环境下实现文件系统的无缝访问&#x…...

C++学习-入门到精通-【6】指针

C学习-入门到精通-【6】指针 指针 C学习-入门到精通-【6】指针一、指针的初始化二、指针运算符地址运算符&间接引用运算符* 三、使用指针的按引用传递方式四、内置数组标准库函数的begin和end内置数组的局限性 五、使用const修饰指针 一、指针的初始化 指针在声明或赋值时…...

数据集-目标检测系列- 冥想 检测数据集 close_eye>> DataBall

数据集-目标检测系列- 冥想 检测数据集 close * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;数据集训练、推理相关项目&#xff1a;GitHub - XIAN-HHappy/ultralytics-yolo-…...

CoAP 协议介绍及应用场景

CoAP 协议&#xff0c;即受限应用协议&#xff08;Constrained Application Protocol&#xff09;&#xff0c;是专为资源受限的设备和网络设计的一种应用层协议 &#xff0c;旨在让小型、低功耗的设备能够接入物联网&#xff08;IoT&#xff09;&#xff0c;并以最小的资源与更…...

【并发编程】基于 Redis 手写分布式锁

目录 一、基于 Redis 演示超卖现象 1.1 Redis 超卖现象 1.2 超卖现象解决方案 二、Redis 的乐观锁机制 2.1 原生客户端演示 2.2 业务代码实现 三、单机部署 Redis 实现分布式锁 3.1 分布式锁的演变和升级 3.2 setnx 实现分布式锁 3.2.1 递归调用实现分布式锁 3.2.2 循…...

adb命令查询不到设备?

一、背景 -----以鸿蒙系统为例&#xff0c;其他系统类似--- 1、确保adb在电脑上成功安装 2 、连接手机 adb devices 列表中无显示设备 二、解决 1. 手机打开开发者模式 手机型号不同&#xff0c;所以选项不一样 2. 一般流程是&#xff1a;设置--搜索--“开发”--会出现开…...

JavaScript 数组去重:11 种方法对比与实战指南

文章目录 前言一、使用 Set 数据结构二、使用 filter indexOf三、使用 reduce 累加器四、双重 for 循环五、利用对象属性唯一性六、先排序后去重七、使用 Map 数据结构八、使用 includes 方法九、优化处理 NaN 的 filter 方法十、利用 findIndex十一.利用Set和展开运算符处理多…...

SlideLoss与FocalLoss在YOLOv8分类损失中的应用及性能分析

文章目录 一、引言二、YOLOv8 损失函数概述三、SlideLoss 详解&#xff08;一&#xff09;SlideLoss 的原理&#xff08;二&#xff09;SlideLoss 的代码实现 四、FocalLoss 分类损失函数详解&#xff08;一&#xff09;FocalLoss 的原理&#xff08;二&#xff09;FocalLoss 的…...