【软件系统架构】单体架构
一、引言
在软件开发的漫长历程中,架构的选择一直是至关重要的决策。单体架构作为一种经典的架构模式,曾经在许多项目中发挥着不可替代的作用。虽然如今微服务等架构逐渐流行,但理解单体架构对于深入掌握软件架构体系仍然有着重要意义。
二、单体架构定义
单体架构是一种将所有功能模块(如业务逻辑、数据访问、用户界面等)都打包在一个单一的可执行程序中的软件架构。就像是一个大的容器,里面包含了应用程序的所有部分,各个部分紧密耦合,共享代码库、数据库等资源。
三、单体架构发展历史
早期的软件系统相对简单,单体架构因其简单直接的构建方式而被广泛采用。在计算机技术发展的初期,硬件资源有限,开发人员更倾向于构建紧凑、一体化的应用。随着业务需求的不断增长,单体架构也在不断扩展,但基本的架构模式在很长一段时间内保持不变。例如,许多传统的企业级应用,如早期的ERP系统,大多采用单体架构构建。
四、单体架构特点
(一)简单性
开发相对简单,所有功能都在一个项目中,对于小型项目或者团队经验不足的情况下,易于上手。开发人员可以快速搭建起一个功能完整的应用,不需要处理复杂的分布式系统的通信、协调等问题。
(二)易于部署
整个应用只需要部署一个单元,与分布式系统相比,部署过程更加直接。不需要考虑多个服务之间的部署顺序、依赖关系等复杂情况。
(三)紧耦合
各个功能模块之间相互依赖,共享代码和数据结构。这种紧耦合的特性使得在修改一个模块时,可能会影响到其他模块的功能,导致系统的可维护性随着项目规模的扩大而降低。
五、单体架构细分类型
(一)分层式单体架构
- 架构特点
- 通常按照功能将应用分为表示层、业务逻辑层和数据访问层。表示层负责与用户交互,业务逻辑层处理业务规则,数据访问层与数据库交互。这种分层结构使得代码具有一定的组织性,便于开发人员理解和维护。
- 各层之间通过接口进行通信,上层依赖下层,下层为上层提供服务。例如,表示层调用业务逻辑层的方法来处理用户请求,业务逻辑层再调用数据访问层的方法来获取或存储数据。
- 适用场景
- 适用于业务逻辑相对简单、规模较小的应用。比如一些小型的企业内部管理系统,如员工考勤系统,主要功能集中在数据的录入、查询和简单的统计分析,分层式单体架构可以很好地满足需求。
(二)模块化单体架构
- 架构特点
- 将应用划分为多个模块,每个模块负责特定的功能集。模块之间有一定的独立性,但仍然在同一个代码库中。例如,在一个电商应用中,可以将用户管理、商品管理、订单管理等分别作为不同的模块。
- 模块之间可能存在一定的依赖关系,通过定义良好的接口来进行交互。这种架构在一定程度上提高了代码的可维护性和可扩展性,相比分层式单体架构,模块之间的耦合度更低。
- 适用场景
- 对于中等规模、功能相对较多但还不足以拆分微服务的应用比较适合。比如一个具有多种业务功能,如在线教育平台中的课程管理、学生学习记录管理、教师管理等功能的应用,可以采用模块化单体架构。
六、单体架构优缺点
分类 | 具体描述 | 示例说明 |
---|---|---|
优点 | ||
开发效率 | 单代码库快速开发,无需处理分布式系统复杂性,适合快速原型开发和简单需求项目。 | 初创公司开发用户管理系统,1 周内完成核心功能并上线验证市场。 |
资源利用 | 仅需单个运行环境,硬件资源占用低,适合小型项目或资源受限场景。 | 小型企业使用 1 台服务器部署单体 ERP 系统,支撑 50 人同时在线办公。 |
缺点 | ||
可维护性差 | 代码库庞大复杂,模块紧耦合,修改易引发连锁反应。 | 修改订单表字段需同步更新订单处理、库存管理、财务结算等多个模块。 |
扩展性有限 | 无法针对单一功能扩展,需整体升级,导致资源浪费。 | 电商平台订单量激增时,需整体扩容服务器,而非仅扩展订单处理模块。 |
(一)优点
开发效率
在项目初期,由于开发人员可以在一个代码库中快速开发功能,不需要考虑复杂的分布式系统构建,所以开发速度较快。对于一些快速原型开发或者需求明确、功能简单的项目来说,能够快速上线。
资源利用
单体架构的应用只需要一个运行环境,相比于分布式架构,在资源消耗方面可能更低。例如,不需要为多个服务分别配置独立的服务器资源,在小型项目中可以充分利用有限的硬件资源。
(二)缺点
可维护性差
随着应用规模的增大,代码库变得庞大复杂。由于各个功能模块之间的紧耦合,一个小的修改可能会在整个应用中产生连锁反应。例如,修改数据库结构可能会影响到多个业务逻辑模块,需要对整个应用进行全面的测试。
扩展性有限
当需要对应用的某个功能进行大规模扩展时,由于单体架构的限制,很难做到独立扩展。例如,在一个单体架构的电商应用中,如果订单处理模块需要应对大量订单的处理,很难单独对该模块进行水平扩展,往往需要对整个应用进行扩展,这可能会带来不必要的资源浪费。
七、单体架构的案例
以一个传统的图书馆管理系统为例。这个系统包含了图书信息管理(包括图书的录入、查询、借阅等)、读者信息管理(读者注册、借阅记录查询等)以及系统管理(用户权限管理等)等功能。整个系统采用单体架构构建,所有功能都在一个可执行程序中。开发人员使用分层式单体架构,将表示层、业务逻辑层和数据访问层分开。表示层提供用户界面,业务逻辑层处理诸如借阅规则、还书规则等业务逻辑,数据访问层与数据库交互存储和获取相关信息。
早期的 eBay 网站
eBay 在发展初期采用了单体架构。当时,其业务主要集中在提供一个在线拍卖平台,功能相对单一。单体架构使得 eBay 能够快速开发和部署网站,满足用户的基本需求。开发团队可以专注于核心业务功能的实现,如商品发布、竞拍、交易等功能的开发。随着业务的增长,eBay 逐渐面临性能和可扩展性的挑战,才开始逐步向分布式架构转型。
小型企业的内部管理系统
许多小型企业的内部管理系统,如财务管理系统、人力资源管理系统等,常采用单体架构。以一个小型制造企业为例,其财务管理系统涵盖了账务处理、报表生成、预算管理等功能。由于企业规模较小,业务流程相对简单,采用单体架构可以满足企业的日常管理需求。开发和维护成本较低,企业内部的 IT 人员能够轻松应对系统的日常运维工作。
八、系统整体框架代码举例
以简单的Java分层式单体架构为例
(一)表示层(以JSP页面为例)
<%@ page contentType="text/html; charset=UTF - 8" %>
<html>
<head><title>图书馆管理系统 - 图书查询</title>
</head>
<body><h1>图书查询</h1><form action="bookQueryServlet" method="post"><label for="bookTitle">图书标题:</label><input type="text" id="bookTitle" name="bookTitle"><br><input type="submit" value="查询"></form>
</body>
</html>
(二)业务逻辑层(BookQueryService.java)
import java.util.List;public class BookQueryService {private BookDao bookDao;public BookQueryService(BookDao bookDao) {this.bookDao = bookDao;}public List<Book> queryBooksByTitle(String title) {return bookDao.getBooksByTitle(title);}
}
(三)数据访问层(BookDao.java)
import java.util.List;public interface BookDao {List<Book> getBooksByTitle(String title);
}// 假设的数据库连接类
class DatabaseConnection {// 数据库连接相关代码
}// 实现BookDao接口的类
class BookDaoImpl implements BookDao {@Overridepublic List<Book> getBooksByTitle(String title) {// 数据库查询逻辑,假设使用JDBCDatabaseConnection connection = new DatabaseConnection();// 执行查询并返回结果return null;}
}
以 Java Spring Boot 为例)
下面是一个简单的基于 Spring Boot 的单体架构 Web 应用示例,实现了一个用户管理模块的基本功能,包括用户注册和查询。
项目结构
src/├── main/│ ├── java/│ │ └── com/│ │ └── example/│ │ ├── config/│ │ │ └── WebMvcConfig.java│ │ ├── controller/│ │ │ └── UserController.java│ │ ├── model/│ │ │ └── User.java│ │ ├── repository/│ │ │ └── UserRepository.java│ │ ├── service/│ │ │ └── UserService.java│ │ └── Application.java│ └── resources/│ ├── application.properties│ └── static/│ └── index.html└── test/└── java/└── com/└── example/└── ApplicationTests.java
User 模型类
package com.example.model;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;@Entitypublic class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}
User 仓库接口
package com.example.repository;import com.example.model.User;import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {}
User 服务类
package com.example.service;import com.example.model.User;import com.example.repository.UserRepository;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class UserService {@Autowiredprivate UserRepository userRepository;public User saveUser(User user) {return userRepository.save(user);}public User findUserById(Long id) {return userRepository.findById(id).orElse(null);}}
User 控制器类
package com.example.controller;import com.example.model.User;import com.example.service.UserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;@RestController@RequestMapping("/users")public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public User registerUser(@RequestBody User user) {return userService.saveUser(user);}@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.findUserById(id);}}
应用主类
package com.example;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
这个简单的示例展示了一个单体架构 Web 应用的基本结构,各个模块(模型、仓库、服务、控制器)协同工作,实现了用户管理的部分功能。
九、未来发展趋势
随着技术的不断发展,单体架构虽然在一些场景下仍然会被使用,但也在逐渐向混合架构发展。例如,在大型企业应用中,可能会将一些核心的、不易拆分的功能保留在单体架构部分,而将一些边缘的、需要独立扩展或频繁更新的功能拆分成微服务或者Serverless函数。同时,容器化技术也为单体架构的部署和管理提供了新的思路,通过将单体应用容器化,可以提高其可移植性和资源利用率。另外,为了提高单体架构的可维护性,代码模块化和自动化测试技术也会不断得到加强。
尽管面临着诸多挑战,但单体架构在未来仍有其存在的价值。在一些特定场景下,如小型项目、对成本和开发速度要求极高的初创业务、功能简单且不需要频繁扩展的内部工具等,单体架构依然是一个不错的选择。同时,随着技术的发展,单体架构也在不断演进。例如,通过采用容器化技术(如 Docker),可以提高单体应用的部署效率和可移植性;利用云原生技术,将单体应用更好地融入云环境,享受云服务带来的弹性和便捷。此外,结合一些现代化的开发理念和工具,如微前端架构,可以在一定程度上缓解单体架构在大型项目中面临的可维护性和扩展性问题。未来,单体架构将与其他新型架构相互补充,共同为软件系统的构建提供多样化的选择。
相关文章:
【软件系统架构】单体架构
一、引言 在软件开发的漫长历程中,架构的选择一直是至关重要的决策。单体架构作为一种经典的架构模式,曾经在许多项目中发挥着不可替代的作用。虽然如今微服务等架构逐渐流行,但理解单体架构对于深入掌握软件架构体系仍然有着重要意义。 二、…...
强大的AI网站推荐(第三集)—— AskO3
网站:AskO3 号称:由华为全球技术服务部(GTS)基于盘古大模型构建的领域知识大模型 博主评价:学习网络安全必备的网站,ICT服务领域顶级AI网站,如果学习HCIA,园区配置等,也可…...
高速网络包处理,基础网络协议上内核态直接处理数据包,XDP技术的原理
文章目录 预备知识TCP/IP 网络模型(4层、7层)iptables/netfilterlinux网络为什么慢 DPDKXDPBFPeBPFXDPXDP 程序典型执行流通过网络协议栈的入包XDP 组成 使用 GO 编写 XDP 程序明确流程选择eBPF库编写eBPF代码编写Go代码动态更新黑名单 预备知识 TCP/IP…...
C++智能指针详解
C智能指针详解 目录 智能指针概述为什么需要智能指针C标准库中的智能指针 std::unique_ptrstd::shared_ptrstd::weak_ptr 智能指针的实际应用智能指针的最佳实践总结 智能指针概述 智能指针是C中用于自动管理动态分配内存的对象,它们遵循RAII(资源获…...
git 设置保存密码 git保存密码
目录 长久保存密码 长久保存密码 git push和git pull都能使用。 git config --global credential.helper store 然后执行一次 git pull,Git 会提示输入用户名和密码, 输入后保存路径: ~/.git-credentials , Windows系统&…...
clamav服务器杀毒(Linux服务器断网状态下如何进行clamav安装、查杀)
ClamAV服务器杀毒(服务器断网状态也可以使用该方法) 服务器因为挖矿病毒入侵导致断网,进行离线的clamav安装并查杀 安装包下载网址:https://www.clamav.net/downloads 安装.deb,如果服务器处于断网状态,可以…...
深入剖析 RocketMQ 的 ConsumerOffsetManager
在消息队列系统中,准确记录和管理消息的消费进度是保障系统可靠性和数据一致性的关键。RocketMQ 作为一款高性能、高可用的分布式消息队列,其 ConsumerOffsetManager 组件在消费进度管理方面发挥着至关重要的作用。本文将详细介绍 ConsumerOffsetManager…...
一文了解 threejs 中.bin 文件与 .gltf 文件 和 .glb 文件三者之间的关系
文章目录 前言一、.bin 文件的作用二、.gltf 文件的作用三、.gltf 和 .bin 的关系四、.glb 文件的作用五、如何查看或编辑 .bin 文件六、总结 前言 在 GLTF 生态中,.bin 文件是 GLTF 格式的重要组成部分,通常与 .gltf 文件一起使用。以下是它们的详细关…...
蓝桥杯(N皇后问题)------回溯法
题目描述 在 NN 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45 角的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法…...
Linux系统中关闭Docker服务并禁止其开机自启 、docker 安装目录结构分析 | 【du -sh *】
文章目录 在Linux系统中关闭Docker服务并禁止其开机自启,具体步骤如下:适用于使用 systemd 的系统(如Ubuntu 16.04/CentOS 7等)适用于使用 SysVinit 或 Upstart 的旧版系统其他注意事项示例输出 linux 下 一条命令实现 统计各个目…...
免费下载 | 2025低空经济产业发展报告
低空经济概览 产业链条:低空经济产业链分为上游的低空经济基础设施(如空管系统、飞行基地等)、中游的低空制造(包括无人机、eVTOL、直升机等飞行器的设计、研发、生产)和下游的低空运营及飞行服务。低空经济以低空空域…...
单一职责原则开闭原则其他开发原则
一、单一职责原则(Single Responsibility Principle, SRP) 定义 一个类应该有且仅有一个引起它变化的原因(即一个类只负责一个职责)。 核心思想 高内聚:类的功能高度集中 低耦合:减少不同职责之间的相互影…...
(自用)yolo算法学习
1.难受中,看了教程过后无从下手啊 2.pycharm专业版成功就好 3.安装包时出先问题 (base) PS G:\pycharm\projects\yolo\yolov5> pip install opencv-python>4.1.1 Requirement already satisfied: opencv-python>4.1.1 in g:\anaconda\app\lib\site-packa…...
手机号登录与高并发思考
基础逻辑 一般来说这个验证码登录分为手机号、以及邮箱登录 手机号短信验证,以腾讯云SMS 服务为例: 这个操作无非对后端来说就是两个接口: 一个是获取验证码,这块后端生成6位数字expire_time 去推送到腾讯云sdk ,腾…...
Linux系统管理与编程07:任务驱动综合应用
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 [环境] windows11、centos9.9.2207、zabbix6、MobaXterm、Internet环境 [要求] zabbix6.0安装环境:Lamp(linux httpd mysql8.0 php) [步骤] 2 …...
12:表的内外连接
1. 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。 新的内连接的语法: select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件; //通过…...
Mybatis的基础操作——03
写mybatis代码的方法有两种: 注解xml方式 本篇就介绍XML的方式 使用XML来配置映射语句能够实现复杂的SQL功能,也就是将sql语句写到XML配置文件中。 目录 一、配置XML文件的路径,在resources/mapper 的目录下 二、写持久层代码 1.添加mappe…...
在CentOS系统上运行Ruby on Rails应用的详细步骤
以下是AI生成,仅做备份。 1. 安装必要的依赖 在CentOS上,首先要安装一些基础的开发工具和依赖库,它们能确保后续的安装和运行过程顺利进行。 sudo yum update -y sudo yum install -y git gcc-c patch readline readline-devel zlib zlib-…...
《AI大模型趣味实战》第6集:基于大模型和RSS聚合打造个人新闻电台
《AI大模型趣味实战》第6集:基于大模型和RSS聚合打造个人新闻电台 摘要 本文将带您探索如何结合AI大模型和RSS聚合技术,打造一个功能丰富的个人新闻电台系统。我们将使用Python和PyQt5构建一个桌面应用程序,该应用可以从多个RSS源抓取新闻&…...
Unity 与 JavaScript 的通信交互:实现跨平台的双向通信
前言 在现代游戏开发和 Web 应用中,Unity 和 JavaScript 的结合越来越常见。Unity 是一个强大的跨平台游戏引擎,而 JavaScript 是 Web 开发的核心技术之一。通过 Unity 和 JavaScript 的通信交互,开发者可以实现从 Unity 到 Web 页面的功能扩…...
Sql Server 索引性能优化 分析以及分表
定位需优化语句 根据工具 skywking 或者开启慢查询日志 找到 慢sql 的语句根据 执行过程 来 判断 慢的原因 row filter 指标 看查了多少数据 比例多少 type 看下是单表 还是 join联表 比如 执行步骤多 没索引 优化方向 减少执行次数索引 没索引考虑加索引 加索引 尽量选择 i…...
Vue.js 模板语法全解析:从基础到实战应用
引言 在 Vue.js 的开发体系中,模板语法是构建用户界面的核心要素,它让开发者能够高效地将数据与 DOM 进行绑定,实现动态交互效果。通过对《Vue.js 快速入门实战》中关于 Vue 项目部署章节(实际围绕 Vue 模板语法展开)…...
【JVM】内存区域划分,类加载机制和垃圾回收机制
本篇内容为了解 JVM 的内存区域划分,类加载机制,垃圾回收机制。实际开发中几乎用不到,但为了某些情况我们又不得不了解。 目录 一、JVM中的内存区域划分 1.1 内存区域划分考点 二、JVM的类加载机制 2.1 类加载流程 2.2 类加载什么时候会…...
代码随想录算法训练营第十四天|替换数字
文档讲解:代码随想录 难度:easy 附:冲 passion!!!passion!!!passion!!! 替换数字 卡码网题目链接(opens new window) 给定一个字符串…...
Java实体类(Javabean)-编程规范
Java学习笔记-Java实体类详解 今天我们要聊一个看似简单却至关重要的知识点——Java实体类。就像快递小哥打包物件需要包装盒一样,在Java世界里处理数据也需要专门的容器,这就是我们的实体类! 一、实体类是什么?——程序的"…...
深入解析 Java Stream API:筛选子节点的优雅实现!!!
🚀 深入解析 Java Stream API:筛选子节点的优雅实现 🔧 大家好!👋 今天我们来聊聊 Java 8 中一个非常常见的操作:使用 Stream API 从 Map 中筛选出特定条件的元素。🎉 具体来说,我们…...
Vala编程语言教程-面向对象编程语基础
基础 尽管Vala语言并不强制你使用对象进行编程,但有些功能只能通过对象的方式来实现。因此,在大多数情况下,你肯定会希望采用面向对象的编程风格。与大多数当前的编程语言一样,为了定义你自己的对象类型,你需要编写一个…...
写读后感的时候,可以适当地引用书中的内容吗?
写读后感时,适当地引用书中的内容是可以的,这样可以更好地支持你的观点和感受,增强文章的可信度和说服力。 引用书中的内容可以帮助读者更好地理解你所讨论的主题和人物,同时也可以展示你对原著的深入理解和阅读能力。但是&#…...
计算机网络高频(二)TCP/IP基础
计算机网络高频(二)TCP/IP基础 1.什么是TCP/IP⭐⭐ TCP/IP是一种网络通信协议,它是互联网中最常用的协议之一。TCP/IP有两个基本的协议:TCP(传输控制协议)和IP(互联网协议)。 TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的协议。它负…...
蓝桥杯 之 数论
文章目录 习题质数找素数 LCM报数游戏 快速幂数字诗意 组合数与错位排序小蓝与钥匙 同余取模 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数&#x…...
无法写入文件:(FileSystemError): Error: EPERM: operation not permitted, open...)
问题分析: 当我想在Visual Studio Code中编写文件时,出现无法写入文件的错误,发现是权限的问题 解决办法: 右键应用图标 → 以管理员身份运行就可以了...
Java爬虫抓取B站视频信息
依赖 <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.17.2</version> <!-- 最新版可去官网查看 --></dependency>编码 public static List<VideoDto> parseSearchPage(Str…...
Sql Server数据迁移易错的地方
背景:之前一直台式机,毕业准备答辩了,要将代码搬到笔记本运行才方便些。这个Sql数据弄过来搞了好几个小时 还原备份报错:媒体簇的结构不正确。SQL Server 无法处理此媒体簇。 解决:升级到sql server版本比备份的那个高…...
七、服务器远程桌面报错
🌻🌻目录🌻🌻 一、远程桌面报错-用户账户限制(例如,时间限制)会阻止你登录。 一、远程桌面报错-用户账户限制(例如,时间限制)会阻止你登录。 原因是被远程的系…...
JAVA 之「优先队列」:大顶堆与小顶堆的实现与应用
Java 优先队列:大顶堆与小顶堆的实现与应用 文章目录 Java 优先队列:大顶堆与小顶堆的实现与应用一、什么是优先队列和堆?1. 优先队列2. 堆 二、Java PriorityQueue 基本用法1. 默认小顶堆示例代码输出 2. 实现大顶堆示例代码输出 三、大顶堆…...
压缩壳学习
壳是什么 壳就是软件的一个保护套,防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的;加密壳,通过加密软件来保护软件ÿ…...
VRRP配置双出口ipsec隧道建立。
背景:在做毕设时,发现规划的不是那么合理,vrrp主备切换后,ipsec隧道并没有跟着切换到与备防火墙建立隧道,这是因为配置了双出口,路由的设计导致vrrp主备切换ipsec隧道没有跟着切换。 fw1为主,fw…...
机器学习——Numpy的神奇索引与布尔索引
在 NumPy 中,神奇索引(Fancy Indexing) 和 布尔索引(Boolean Indexing) 是两种强大的索引方式,用于从数组中提取特定元素或子集。以下是它们的详细说明和示例: 1. 神奇索引(Fancy In…...
Linux:进程间通信
文章目录 前言一、进程间通信介绍1.1 进程间通信的目的1.2 进程间通信的发展与分类 二、管道2.1 匿名管道原理2.2 通信管道会出现的情况和特性(重要)2.3 命名管道2.3.1 命名管道与匿名管道的区别 三、system V3.1 共享内存原理3.2 键值3.2.1 键值生成原理…...
Mysql配套测试之查询篇
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 条件查询简单测试: 1.查询英语成绩不及格的同学(<60) 2…...
基于SSM框架的汽车租赁平台(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,汽车租赁平台当然不能排除在外。汽车租赁平台是在实际应用和软件工程的开发原理之上,运用Java语言以及SSM框架进行开发&#x…...
常考计算机操作系统面试习题(三下)
20. 请求页式存储管理系统缺页率计算 题目: 假设一个作业的页面走向为 1、2、3、4、1、2、5、1、2、3、4、5,当分配给该作业的物理块数分别为 3 和 4 时,计算采用下述页面置换算法的缺页率: (1) 先进先出(FIFO&…...
Spring IOC核心详解:掌握控制反转与依赖注入
文章目录 前言一、IOC核心思想二、IOC容器实现1.核心接口:2.XML配置范例 三、Bean管理实践1.创建对象(1)基于xml方式创建对象(2)用注解的方式创建对象 2.依赖注入(1)基于xml方式注入属性基础类型…...
Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发
DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序,必须通过Servlet来处理 没有Servlet,java是无法处理web请求的 Web交互: 接收请求HttpServletRequest:可以获取到请求的信息,比如uri&#…...
Linux 内核源码阅读——ipv4
Linux 内核源码阅读——ipv4 综述 在 Linux 内核中,IPv4 协议的实现主要分布在 net/ipv4/ 目录下。以下是一些关键的源文件及其作用: 1. 协议栈核心 net/ipv4/ip_input.c:处理接收到的 IPv4 数据包(输入路径)。net…...
组合总和 II:去重逻辑深度解析
组合总和 II:去重逻辑深度解析 在算法中,解决“组合总和 II”这类问题时,去重往往是最具挑战性的一环。如何避免重复组合,同时保证所有组合的唯一性,是实现高效算法的关键。今天,我们就来深度解析组合总和…...
蓝桥杯备考:二分答案之路标设置
最大距离,找最小空旷指数值,我们是很容易想到用二分的,我们再看看这个答案有没有二段性 是有这么个二段性的,我们只要二分就行了,但是二分的check函数是有点不好想的,我们枚举空旷值的时候,为了…...
[HY000][1366] Incorrect string value: ‘å¼ ä¸‘ for column ‘name‘ at row 1
常见原因 字符集不兼容 插入的数据包含当前字符集(如 latin1)不支持的特殊字符(如中文、Emoji 等)。 表、列或连接的字符集未正确配置为支持目标字符(如未使用 utf8mb4)。 客户端/服务端编码不一致 客户…...
什么是C++对象之间的view proxies
在C中,view proxies 是一种轻量级的对象,用于提供对另一个对象的间接访问或视图,而不直接拥有或管理该对象的数据。它们通常用于简化对复杂数据结构的访问,或在不需要复制数据的情况下提供特定的视图。 1. View Proxies 的核心概…...
MyBatis参数赋值技巧:#{} 和 ${} 的区别与实践
目录 一、前言二、 #{} 和${} 的使用方法和区别2.1 #{}使用方法2.2 ${}使用方法2.3#{} 和 ${} 的主要区别2.4使用建议 三、总结 一、前言 在 MyBatis 中,#{} 和 ${} 都用于在 SQL 语句中绑定参数,但它们在具体实现和安全性方面有所不同。理解它们的区别…...