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

Spring Boot 中 MongoDB @DBRef注解适用什么场景?

在 Spring Boot 中使用 MongoDB 时,@DBRef 注解提供了一种在不同集合(collections)的文档之间建立引用关系(类似于关系型数据库中的外键)的方式。它允许你将一个文档的引用存储在另一个文档中,并在查询时自动解析这个引用。

如何使用 @DBRef

假设我们有两个实体:Author (作者) 和 Book (书籍)。一个作者可以写多本书,一本书有一个作者。

  1. 定义实体类:

    // Author.java
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;@Document(collection = "authors") // 指定集合名称
    public class Author {@Idprivate String id;private String name;private int age;// Constructors, Getters, Setterspublic Author(String name, int age) {this.name = name;this.age = age;}public String getId() { return id; }public void setId(String id) { this.id = id; }public String getName() { return name; }public void setName(String name) { this.name = name; }public int getAge() { return age; }public void setAge(int age) { this.age = age; }@Overridepublic String toString() {return "Author{" +"id='" + id + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
    }// Book.java
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.DBRef;
    import org.springframework.data.mongodb.core.mapping.Document;@Document(collection = "books") // 指定集合名称
    public class Book {@Idprivate String id;private String title;@DBRef // 关键注解private Author author; // 引用 Author 对象// Constructors, Getters, Setterspublic Book(String title, Author author) {this.title = title;this.author = author;}public String getId() { return id; }public void setId(String id) { this.id = id; }public String getTitle() { return title; }public void setTitle(String title) { this.title = title; }public Author getAuthor() { return author; }public void setAuthor(Author author) { this.author = author; }@Overridepublic String toString() {return "Book{" +"id='" + id + '\'' +", title='" + title + '\'' +", author=" + (author != null ? author.getName() : "null") + // 避免NPE并显示作者名'}';}
    }
    
  2. 定义 Repository 接口:

    // AuthorRepository.java
    import org.springframework.data.mongodb.repository.MongoRepository;
    public interface AuthorRepository extends MongoRepository<Author, String> {}// BookRepository.java
    import org.springframework.data.mongodb.repository.MongoRepository;
    public interface BookRepository extends MongoRepository<Book, String> {}
    
  3. 使用示例:

    // MyService.java or a CommandLineRunner for demonstration
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.stereotype.Component;@Component
    public class DataInitializer implements CommandLineRunner {@Autowiredprivate AuthorRepository authorRepository;@Autowiredprivate BookRepository bookRepository;@Overridepublic void run(String... args) throws Exception {authorRepository.deleteAll();bookRepository.deleteAll();// 1. 创建并保存 AuthorAuthor author = new Author("J.K. Rowling", 55);authorRepository.save(author);System.out.println("Saved Author: " + author);// 2. 创建 Book 并引用已保存的 AuthorBook book1 = new Book("Harry Potter and the Philosopher's Stone", author);bookRepository.save(book1);System.out.println("Saved Book: " + book1);Book book2 = new Book("Harry Potter and the Chamber of Secrets", author);bookRepository.save(book2);System.out.println("Saved Book: " + book2);// 3. 查询 Book,Author 信息会自动加载 (默认 eager loading)Book fetchedBook = bookRepository.findById(book1.getId()).orElse(null);if (fetchedBook != null) {System.out.println("Fetched Book: " + fetchedBook);System.out.println("Fetched Book's Author Name: " + fetchedBook.getAuthor().getName());}}
    }
    

MongoDB 中存储的内容:

当保存 Book 对象时,MongoDB 中的 books 集合会存储类似以下结构的文档:

{"_id": ObjectId("someBookId"),"title": "Harry Potter and the Philosopher's Stone","author": {"$ref": "authors", // 被引用集合的名称"$id": ObjectId("someAuthorId") // 被引用文档的_id// "$db": "databaseName" // 可选,如果跨数据库引用},"_class": "com.example.Book" // Spring Data MongoDB 存储的类信息
}

当查询 Book 时,Spring Data MongoDB 看到 author 字段是一个 DBRef,它会自动发起另一个查询authors 集合,使用 $id 字段的值去查找对应的 Author 文档,并将其填充到 Book 对象的 author 属性中。

懒加载 (Lazy Loading)

默认情况下,@DBRef根其它字段一起加载 (eager loading) 的。这意味着当你加载包含 @DBRef 字段的文档时,Spring Data MongoDB 会立即发出额外的查询来加载被引用的文档。

要启用懒加载 (lazy loading),你需要设置 lazy = true

// Book.java
// ...
@DBRef(lazy = true)
private Author author;
// ...

懒加载如何工作:

  1. 代理对象 (Proxy): 当启用懒加载时,Spring Data MongoDB 不会立即加载 author 对象。相反,它会为 author 属性创建一个代理对象
  2. 首次访问触发加载: 当你的代码第一次尝试访问被 @DBRef(lazy = true) 注解的属性的任何方法或字段时(例如 book.getAuthor().getName()),代理对象会拦截这个调用。
  3. 数据库查询: 此时,代理对象会向 MongoDB 发起一个查询,根据存储的 $ref$id 来获取实际的 Author 数据。
  4. 对象填充: 获取到数据后,代理对象会被实际的 Author 对象替换(或代理对象内部填充数据),然后原始的方法调用(如 getName())才会继续执行。
  5. 后续访问: 一旦数据被加载,后续对该 author 对象的访问将直接使用已加载的数据,不会再触发新的数据库查询(除非对象被重新加载)。

懒加载的注意事项:

  • NoSQLSession 异常风险: 如果在 MongoDB session/transaction 之外或 Spring 上下文管理之外尝试访问懒加载的属性,可能会遇到问题(尽管在 Spring Data MongoDB 中这通常不像 JPA 中那么严格,因为连接管理方式不同)。通常,只要在 Spring 管理的 bean (如 Service 方法) 内部访问,就不会有问题。
  • N+1 查询问题: 如果你加载一个 Book 列表,并且每个 Bookauthor 都是懒加载的,那么在遍历列表并访问每个 book.getAuthor() 时,会为每个 Book 单独触发一次到 authors 集合的查询。这被称为 N+1 查询问题,可能导致严重的性能瓶颈。

@DBRef 的优缺点

优点:

  1. 数据规范化 (Normalization): 避免了数据冗余。作者的信息只存储在一处(authors 集合),所有引用它的书籍都指向这一个源。
  2. 数据一致性: 如果作者的信息(例如姓名)发生更改,只需要更新 authors 集合中的一个文档。所有引用该作者的书籍在下次加载时都会获取到最新的信息。
  3. 清晰的对象模型: 在 Java 代码中,关系清晰,易于理解和维护,尤其是对于习惯了关系型数据库的开发者。
  4. Spring Data 自动处理: Spring Data MongoDB 简化了引用的解析,开发者不需要手动编写额外的查询来获取关联数据。

缺点:

  1. 性能开销 (多次查询):
    • 现加载: 每次加载主文档时,都会为每个 @DBRef 字段额外执行一次数据库查询。如果一个文档有多个 @DBRef,或者查询一个文档列表,每个文档都有 @DBRef,会导致大量额外的查询。
    • 懒加载: 虽然推迟了查询,但在访问时仍然需要额外的查询。如果在一个循环中访问多个懒加载的引用,同样会导致 N+1 查询问题。
  2. 无数据库级引用完整性: MongoDB 本身不强制引用完整性。如果你删除了一个被 @DBRef 引用的 Author 文档,那么 Book 文档中的 author 引用就会变成一个“悬空引用”(dangling reference)。Spring Data MongoDB 在尝试解析这个引用时可能会返回 null 或抛出异常,具体行为取决于配置和版本。应用程序需要自己处理这种情况。
  3. 不是 MongoDB 的原生“Join”: MongoDB 的设计更倾向于通过内嵌文档(embedding)来处理关联数据以获得更好的读性能。@DBRef 实际上是在客户端(或应用层)模拟了“join”操作,这与 MongoDB 的核心优势有所不同。
  4. 增加了复杂性: 管理多个集合和它们之间的引用关系,尤其是在数据一致性和悬空引用方面,需要额外的考虑。

适用场景

  1. “多对一”或“一对一”关系,且被引用对象经常独立访问或更新:
    例如,BookAuthor (多对一)。Author 对象本身可能被独立查询和更新。

  2. 被引用数据较大,不适合内嵌:
    如果 Author 对象包含大量信息(如详细的传记、多张图片等),将其内嵌到每个 Book 文档中会导致 Book 文档过大且数据冗余。

  3. 数据规范化和一致性优先于极致的读取性能:
    当确保数据只在一个地方更新,并且所有引用都指向最新版本比单次查询的微小性能差异更重要时。

  4. 被引用对象生命周期独立:
    如果 Author 可以独立于 Book 存在(例如,一个作者可能还没有写书,或者一个作者的所有书都被删除了,但作者信息仍需保留)。

何时不适用或考虑替代方案

  1. “一对多”关系中,“多”的那一方数据量巨大且经常与“一”一起查询:
    例如,一个 Order 有很多 OrderItems。如果总是需要同时加载 Order 和其所有 OrderItems,并且 OrderItems 不会被独立查询,那么将 OrderItems 内嵌到 Order 文档中通常性能更好。

  2. 读取性能至关重要,且关联数据经常一起访问:
    考虑内嵌文档。

  3. 需要原子性更新:
    如果主文档和其关联数据需要作为一个原子单元进行更新,内嵌文档是更好的选择,因为 MongoDB 的原子操作是文档级别的。

  4. 可以接受少量数据冗余以换取性能:
    例如,在 Book 文档中存储 authorIdauthorName。如果 authorName 很少更改,这种轻微的冗余可以避免额外的查询。但更新 authorName 时需要更新所有相关的 Book 文档。

替代方案:

  • 手动引用 (Manual References):Book 文档中只存储 authorId (一个 StringObjectId)。

    public class Book {// ...private String authorId;// ...
    }
    

    然后在服务层手动查询 Author

    // In a service
    public BookDTO getBookWithAuthor(String bookId) {Book book = bookRepository.findById(bookId).orElse(null);if (book == null) return null;Author author = authorRepository.findById(book.getAuthorId()).orElse(null);// map to DTO
    }
    

    这种方式给予你更多控制权,可以批量加载关联数据(例如,先获取所有 Book,然后收集所有 authorId,再用一个 findByIdIn(...) 查询所有 Author),从而避免 N+1 问题。

  • 内嵌文档 (Embedding):
    如果 Author 信息不复杂,且与 Book 紧密耦合,可以直接将 Author 的部分或全部信息内嵌到 Book 文档中。

    // Book.java (simplified for embedding)
    public class Book {@Id private String id;private String title;private EmbeddedAuthor author; // Author信息作为内嵌对象// ...
    }// EmbeddedAuthor.java (not a @Document)
    public class EmbeddedAuthor {private String authorId; // 原Author的ID,可选private String name;// ...
    }
    

    这会提高读取性能(一次查询),但可能导致数据冗余和更新复杂性。

  • MongoDB $lookup (聚合管道):
    对于更复杂的“join”需求,可以使用 MongoDB 的聚合框架中的 $lookup 操作符。Spring Data MongoDB 支持通过 @Aggregation 注解或 MongoTemplate 来执行聚合查询。在数据库服务器端执行类似 join 的操作。

总结来说,@DBRef 提供了一种方便的方式来处理 MongoDB 中的引用关系,但它并非没有代价,尤其是在性能方面。理解其工作原理、优缺点以及懒加载机制,并根据具体应用场景和需求(数据模型、查询模式、性能要求、一致性需求)来决定是否使用它,或者选择手动引用、内嵌文档或 $lookup 等其他策略。

相关文章:

Spring Boot 中 MongoDB @DBRef注解适用什么场景?

在 Spring Boot 中使用 MongoDB 时&#xff0c;DBRef 注解提供了一种在不同集合&#xff08;collections&#xff09;的文档之间建立引用关系&#xff08;类似于关系型数据库中的外键&#xff09;的方式。它允许你将一个文档的引用存储在另一个文档中&#xff0c;并在查询时自动…...

PDF生成模块开发经验分享

在日常的项目开发中&#xff0c;PDF文档的生成是一个常见的需求。无论是用于申报单、审批结果通知书还是其他业务相关的文档输出&#xff0c;一个高效且灵活的PDF生成功能都是不可或缺的。本文将基于我使用Java&#xff08;Spring Boot&#xff09;和iText库开发PDF生成模块的经…...

Music AI Sandbox:打开你的创作新世界

AI 和音乐人的碰撞 其实&#xff0c;Google 早在 2016 年就启动了一个叫 Magenta 的项目&#xff0c;目标是探索 AI 在音乐和艺术创作上的可能性。一路走来&#xff0c;他们和各种音乐人合作&#xff0c;终于在 2023 年整出了这个 Music AI Sandbox&#xff0c;并且通过 YouTub…...

RISC-V入门资料

以下是获取 RISC-V 相关资料的权威渠道和推荐资源&#xff0c;涵盖技术文档、开发工具、社区支持等&#xff1a; 1. 官方资料 RISC-V 国际基金会官网 https://riscv.org 核心文档&#xff1a;ISA 规范&#xff08;包括基础指令集&#xff08;RV32I/RV64I&#xff09;、扩展指令…...

私服与外挂:刑事法律风险的深度剖析

首席数据官高鹏律师团队编著 在当今数字化时代&#xff0c;网络游戏产业蓬勃发展&#xff0c;然而与之相伴的私服与外挂现象却屡禁不止&#xff0c;且其背后隐藏着严重的刑事法律风险。作为一名律师&#xff0c;有必要在此对私服与外挂相关的刑事问题进行深入解读&#xff0c;以…...

sherpa-ncnn:Endpointing(断句规则)

更多内容&#xff1a;XiaoJ的知识星球 目录 1. Endpointing (端点)1.1 规则11.2 规则21.3 规则3 1. Endpointing (端点) 我们有三条端点检测规则。如果激活了其中任何一个&#xff0c;我们假设检测到终端节点。 . 1.1 规则1 规则 1 计算尾随静默的持续时间。如果大于用户指…...

谷云科技iPaaS技术实践:集成平台如何解决库存不准等问题

在当今竞争激烈的商业环境中&#xff0c;电商平台、仓库系统以及门店系统之间的数据不同步问题&#xff0c;如同一颗隐形的 “定时炸弹”&#xff0c;严重威胁着企业的生存与发展。尤其是在库存管理方面&#xff0c;订单系统显示商品已售出&#xff0c;但仓库却无货可发&#x…...

负载均衡算法解析(一)NGINX

文章目录 1. 核心数据结构&#xff1a;算法的基石1.1 负载均衡节点结构&#xff1a;定义服务器实体1.2 关键概念阐述&#xff1a;权重 (Weight) 2. NGINX加权轮询算法旨在解决的具体问题深度分析2.1 应对后端服务器间的负载不均衡问题2.2 后端服务健康状态的动态感知与自适应调…...

计算机网络笔记(十六)——3.3使用广播信道的数据链路层

3.3.1局域网的数据链路层 一、核心逻辑架构&#xff08;拓扑结构演变&#xff09; 二、MAC层核心机制 MAC地址结构 以太网帧格式 CSMA/CD工作机制流程 三、关键功能对比表 功能集线器(Hub)交换机(Switch)网桥(Bridge)工作层级物理层数据链路层数据链路层冲突域处理全广播&…...

STM32-模电

目录 一、MOS管 二、二极管 三、IGBT 四、运算放大器 五、推挽、开漏、上拉电阻 一、MOS管 1. MOS简介 这里以nmos管为例&#xff0c;注意箭头方向。G门极/栅极&#xff0c;D漏极&#xff0c;S源极。 当给G通高电平时&#xff0c;灯泡点亮&#xff0c;给G通低电平时&a…...

单片机 + 图像处理芯片 + TFT彩屏 指示灯控件

指示灯控件使用说明 简介 这是一个基于单片机 RA8889/RA6809图形处理芯片的指示灯的控件库&#xff0c;用于在TFT显示屏上显示各种状态的指示灯。该控件支持多种状态显示&#xff0c;包括正常、警告、错误和停止等状态&#xff0c;并支持自定义标签显示。 功能特点 支持多…...

73页最佳实践PPT《DeepSeek自学手册-从理论模型训练到实践模型应用》

这份文档是一份关于 DeepSeek 自学手册的详细指南&#xff0c;涵盖了 DeepSeek V3 和 R1 模型的架构、训练方法、性能表现以及使用技巧等内容。它介绍了 DeepSeek V3 作为强大的 MoE 语言模型在数学、代码等任务上的出色表现以及其训练过程中的创新架构如多头潜在注意力和多 To…...

Python自动化-python基础(上)

一.魔法方法 在 Python 中&#xff0c;魔法方法&#xff08;Magic Methods&#xff09;是一类特殊的方法&#xff0c;以双下划线 __ 开头和结尾 &#xff0c;它们在特定的场景下会被 Python 解释器自动调用&#xff0c;用于实现一些内置的操作行为。 1. 初始化与构造相关 __…...

mysql数据库体验

目录 数据库简介 使用数据库 数据库的基本概念 数据 数据库和数据库表 数据库管理系统和数据库系统 数据库系统发展史 经典数据库 网状模型 层次模型 关系模型 当今主流数据库介绍 关系数据库 非关系型库的基本概念 关系数据库的基本结构 主键与外键 主键 外…...

Python开发系统

以下是一个基于Python和OpenCV的简单图像检测系统开发示例&#xff0c;包含目标检测、颜色检测和边缘检测功能&#xff1a; 一、环境搭建 1. 安装依赖 pip install opencv-python numpy matplotlib 2. 准备测试图片 下载示例图片或使用本地图片&#xff08;如 test.jpg &…...

架空输电线巡检机器人轨迹优化设计

架空输电线巡检机器人轨迹优化 摘要 本论文针对架空输电线巡检机器人的轨迹优化问题展开研究,综合考虑输电线复杂环境、机器人运动特性及巡检任务需求,结合路径规划算法、智能优化算法与机器人动力学约束,构建了多目标轨迹优化模型。通过改进遗传算法与模拟退火算法,有效…...

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明 以下是关于在 C++ 和 Qt 中使用共享内存(QSharedMemory)和 Windows 消息机制(SendMessage / PostMessage)进行跨线程或跨进程通信的详细示例。 🧩 使用 QSharedMemory 进行进程间通信(Qt 示例…...

cursor平替,试试 vscode+cline+openrouter 的方案,还能自定义 mcp-server 教程大纲

一、引言 cursor 工具使用成本高的现状 编程agent好用&#xff0c;解放劳动力&#xff0c;但费用贵 vscodeclineopenrouter Cline 是一款可集成在 IDE 中的 AI 编程助手&#xff0c;支持 OpenAI 和 Ollama 等多种模型&#xff0c;能在 IDE 里自主完成复杂编程任务&#xff0c;…...

Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!

本文主要介绍项目&#xff0c;项目的结构&#xff0c;项目如何配置&#xff0c;项目如何打包。这篇文章如果对你有帮助请点赞和收藏&#xff0c;谢谢&#xff01;源代码仅供学习使用&#xff0c;如果转载文章请标明出处&#xff01;&#xff08;免费下载源代码&#xff09;&…...

C++ set替换vector进行优化

文章目录 demo代码解释&#xff1a; 底层原理1. 二叉搜索树基础2. 红黑树的特性3. std::set 基于红黑树的实现优势4. 插入操作5. 删除操作6. 查找操作 demo #include <iostream> #include <set>int main() {// 创建一个存储整数的std::setstd::set<int> myS…...

Android学习总结之算法篇八(二叉树和数组)

路径总和 import java.util.ArrayList; import java.util.List;// 定义二叉树节点类 class TreeNode {int val;TreeNode left;TreeNode right;// 构造函数&#xff0c;用于初始化节点值TreeNode(int x) {val x;} }public class PathSumProblems {// 路径总和 I&#xff1a;判…...

正点原子IMX6U开发板移植Qt时出现乱码

移植Qt时出现乱码 1、前言2、问题3、总结 1、前言 记录一下正点原子IMX6U开发板移植Qt时出现乱码的解决方法&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 2、问题 用正点原子IMX6U开发板移植Qt时移植Qt后&#xff0c;sd卡里已经存储了Qt的各种库&…...

算法解密:轮转数组问题全解析

算法解密:轮转数组问题全解析 一、引言 在算法的世界里,数组的操作问题常常考验着我们对数据结构和算法技巧的掌握程度。“轮转数组”问题就是其中一个经典且有趣的题目。它看似简单,却蕴含着多种巧妙的解法。通过深入研究这个问题,我们能更好地理解数组的特性,提升算法思…...

正则化和L1/L2范式

1. 背景与引入 历史与位置 正则化&#xff08;Regularization&#xff09;是机器学习中控制模型复杂度、提升泛化能力的核心手段之一。 L2范式&#xff08;Ridge正则化&#xff09;最早可追溯至20世纪70年代的Tikhonov正则化&#xff0c;用于解决病态线性方程组问题&#xf…...

day05_java中常见的运算符

对字面量或者变量进行操作的符号就是运算符。用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。 java中常用的运算符有下面几种 算术运算符 代码示例 public class Demo01Operator {public static void main(String[] args) {int a 3;int b 4;System.o…...

Linux_进程退出与进程等待

一、进程退出 ‌退出场景‌ ‌正常终止‌&#xff1a;代码执行完毕且结果符合预期&#xff08;退出码为 0&#xff09;。‌异常终止‌&#xff1a;运行结果错误&#xff08;退出码非 0&#xff09;或进程被信号强制终止。&#xff08;如 SIGINT 或 SIGSEGV&#xff09;。 ‌退…...

SSM框架(Spring + Spring MVC + MyBatis)整合配置的详细步骤

以下是 SSM框架&#xff08;Spring Spring MVC MyBatis&#xff09;整合配置的详细步骤&#xff0c;适用于 Maven 项目。 &#xff08;一&#xff09;、pom.xml中添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"ht…...

B. Zero Array(思维)

Problem - 1201B - Codeforces 思路&#xff1a;每次给任意两个不同下表的数减-1&#xff0c;相当于在这个数组总和S上减2&#xff0c;S为奇数则不可能变为0&#xff0c;S为偶数时&#xff0c;一定存在两个序列组成两个S/2&#xff0c;这样每次都是在两个S/2上各减1&#xff0c…...

FPGA_Verilog实现QSPI驱动,完成FLASH程序固化

FPGA_Verilog实现QSPI驱动&#xff0c;完成FLASH程序固化 操作提要 使用此操作模式实现远程升级的原因是当前的FLASH的管脚直接与FPGA相连接&#xff0c;SPI总线并未直接与CPU相连接&#xff0c;那么则需要CPU下发升级指令与将要升级的文件给FPGA&#xff0c;然后在FPGA内部产…...

前端取经路——框架修行:React与Vue的双修之路

大家好,我是老十三,一名前端开发工程师。在前端的江湖中,React与Vue如同两大武林门派,各有千秋。今天,我将带你进入这两大框架的奥秘世界,共同探索组件生命周期、状态管理、性能优化等核心难题的解决之道。无论你是哪派弟子,掌握双修之术,才能在前端之路上游刃有余。准…...

【DBMS学习系列】一、DBMS(数据库管理系统)的存储模型

一、前置知识 1.1 什么是OLAP 和 OLTP? On-Line Analytical Processing,简称OLAP(联机分析处理),是一种用于处理大规模数据的技术,它提供了一种灵活的分析和查询方式,能够帮助用户从不同维度来分析和理解业务数据。 On-Line Transaction Processing,简称OLTP(联机事…...

Matlab 镍氢电池模型

1、内容简介 Matlab216-镍氢电池模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

39、.NET GC是什么? 为什么需要GC?

.NET GC是什么&#xff1f; .NET GC&#xff08;Garbage Collector&#xff0c;垃圾回收器&#xff09;是.NET运行时&#xff08;CLR&#xff09;的核心组件&#xff0c;负责自动管理托管堆&#xff08;Managed Heap&#xff09;中的内存分配与释放。其核心工作机制包括&#…...

前端缓存踩坑指南:如何优雅地解决浏览器缓存问题?

浏览器缓存&#xff0c;配置得当&#xff0c;它能让页面飞起来&#xff1b;配置错了&#xff0c;一次小小的上线&#xff0c;就能把你扔进线上 bug 的坑里。你可能遇到过这些情况&#xff1a; 部署上线了&#xff0c;结果用户还在加载旧的 JS&#xff1b;接口数据改了&#xf…...

XML语言

XML语言 在开始介绍Mybatis之前&#xff0c;先介绍一下XML语言&#xff0c;XML语言发明最初是用于数据的存储和传输&#xff0c;它是由一个一个的标签嵌套而成 <?xml version"1.0" encoding"UTF-8" ?> <outer> <name>阿伟</name&…...

垃圾回收的三色标记算法

目录 1、介绍 1.1、发展 1.2、基本原理 2、执行过程 2.1、初始标记 (Initial Marking) 2.2、并发标记 (Concurrent Marking) 2.3、重新标记 (Remark) 2.4、垃圾清理阶段 3、并发标记 3.1、浮动垃圾 3.2、漏标 前言 三色标记&#xff08;Tri-color Marking&#xff0…...

紫禁城多语言海外投资理财返利源码带前端uniapp纯工程文件

测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态thinkphp&#xff0c;开启ssl证书 语言&#xff1a;中文简体、英文、越南语、马来语、日语、巴西语、印尼语、泰语 前端是uniapp的源码&#xff0c;我已经把nmp给你…...

深入剖析 I/O 复用之 select 机制

深入剖析 I/O 复用之 select 机制 在网络编程中&#xff0c;I/O 复用是一项关键技术&#xff0c;它允许程序同时监控多个文件描述符的状态变化&#xff0c;从而高效地处理多个 I/O 操作。select 作为 I/O 复用的经典实现方式&#xff0c;在众多网络应用中扮演着重要角色。本文…...

Android开发报错解决

Android开发报错解决 组件相关文件相关权限相关代码相关程序报错IDE相关版本对应框架okhttp请求失败 Roomno such table cocos2d 组件相关 使用gravity属性让文字居中是&#xff0c;需把该属性放在text属性上面ScrollView只能容纳一个子视图 文件相关 放在drawble下的图片资源…...

Linux 网络命名空间:从内核资源管理到容器网络隔离

1. 网络命名空间是什么? 网络命名空间(Network Namespace) 是 Linux 内核提供的一种网络资源隔离机制,用于为进程或容器创建完全独立的网络环境。它并非物理或虚拟的网络接口(如网卡、veth pair 等),而是一个虚拟容器,包含以下资源的独立实例: 网络接口(物理或虚拟)…...

VNC windows连接ubuntu桌面

✅ 步骤 1&#xff1a;安装 VNC 服务器 首先&#xff0c;我们需要在 Winux 系统上安装一个 VNC 服务器。这里我们使用 tigervnc 作为例子&#xff0c;它是一个常用的 VNC 服务器软件。 打开终端并更新你的软件包&#xff1a; sudo apt update安装 tigervnc 服务器&#xff1a;…...

Elastic:如何构建由 AI 驱动的数字客户体验策略

作者&#xff1a;来自 Elastic Elastic Platform Team 客户通过多个数字渠道与企业和组织互动 —— 从网站和应用程序到聊天机器人和电子邮件。这些接触点构成了数字客户体验&#xff08;DCX&#xff09;。无缝的数字客户体验能显著提升客户满意度&#xff0c;进而带动更高的收…...

安防多协议接入/视频汇聚平台EasyCVR助力工地/工程/建筑施工领域搭建视频远程监控系统

一、摄像机安装方案​ 1&#xff09;安装位置选择​&#xff1a;摄像机安装需避开强振源与电磁干扰区&#xff0c;兼顾建筑外观&#xff0c;隐蔽安装。其防护罩应巧妙遮蔽视角&#xff0c;增强安防威慑。电梯轿厢内的摄像机&#xff0c;建议藏于吊顶。连接摄像机的视频、电源及…...

《100天精通Python——基础篇 2025 第16天:异常处理与调试机制详解》

目录 一、认识异常1.1 为什么要使用异常处理机制?1.2 语法错误1.3 异常错误1.4 如何解读错误信息 二、异常处理2.1 异常的捕获2.2 Python内置异常2.3 捕获多个异常2.4 raise语句与as子句2.5 使用traceback查看异常2.6 try…except…else语句2.7 try…except…finally语句--捕获…...

Ceph PG unfound/lost 问题排查与解决

Ceph PG unfound/lost 问题排查与解决 背景现象排查过程经验总结参考命令结语 背景 Ceph 集群出现 HEALTH_ERR&#xff0c;提示有 PG 对象丢失&#xff08;unfound&#xff09;&#xff0c;并且 repair 无法自动修复。 现象 ceph health detail 显示&#xff1a; HEALTH_ERR …...

LeetCode热题100--54.螺旋矩阵--中等

1. 题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a; 输入&#xff1a;ma…...

【嵌入式开发-CAN】

嵌入式开发-CAN ■ CAN简介 ■ CAN简介...

SQLite3介绍与常用语句汇总

SQLite3简介 SQLite3是一款轻量级的、基于文件的开源关系型数据库引擎&#xff0c;由 D. Richard Hipp 于 2000 年首次发布。它遵循 SQL 标准&#xff0c;但与传统的数据库系统不同&#xff0c;SQLite 并不运行在独立的服务器进程中&#xff0c;而是作为一个嵌入式数据库引擎直…...

uniapp中score-view中的文字无法换行问题。

项目场景&#xff1a; 今天遇到一个很恶心的问题&#xff0c;uniapp中的文字突然无法换行了。得..就介样 原因分析&#xff1a; 提示&#xff1a;经过一fan研究后发现 scroll-view为了能够横向滚动设置了white-space: nowrap; 强制不换行 解决起来最先想到的是&#xff0c;父…...

[学习]RTKLib详解:ephemeris.c与rinex.c

文章目录 RTKLib详解&#xff1a;ephemeris.c与rinex.cPART A: ephemeris.c一、代码整体作用与工作流程分析1.1 整体作用1.2 工作流程 二、核心函数说明2.1 alm2pos (Almanac to Position)2.2 eph2clk (Ephemeris to Clock)2.3 eph2pos (Ephemeris to Position)2.4 geph2pos (G…...