Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
- WebFlux
- 定义:Spring 5引入的响应式Web框架,基于Reactor库实现非阻塞、异步编程模型。通常用途:构建实时通信、流数据处理等高并发场景。使用异步事件驱动模型,单线程可处理数千并发连接。
- 用途:处理高并发网络请求(如2000+ QPS),提升数据库服务器的吞吐量,适用于IO密集型操作。
示例代码:
@RestController
public class UserController {@GetMapping("/users")public Flux<User> getUsers() {return userRepository.findAll(); // 返回响应式数据流}
}
- 响应式架构
- 定义:基于事件驱动和非阻塞IO的架构,资源利用率高,适合高并发场景。通常用途:微服务网关、实时数据处理系统。
- 项目用途:支撑数据库服务器的网络通信模块,确保高QPS下仍能快速响应请求。
- QPS(每秒查询数)测量方法:使用JMeter、Gatling等压力测试工具模拟并发请求。通过WebTestClient发送批量请求,监控响应时间和成功率。
- 合理范围:取决于硬件和业务复杂度,2000+ QPS属于高性能水平,需结合缓存、非阻塞IO等优化实现。
- 三级缓存体系(Caffeine + OffHeap + Redis)
- 堆内缓存(Caffeine):基于Java堆的高性能本地缓存,适合频繁访问的热点数据。通常用途:电商秒杀、实时排行榜等高频读场景。
- 堆外缓存(OffHeap):使用Direct Memory存储数据,减少GC压力,适合大对象。
- Redis集群:分布式缓存,保证数据一致性和高可用性。
层级 | 技术 | 存储内容 | 访问时间
L1 | Caffeine | 热点数据(如最近查询结果) | 纳秒级
L2 | Off-Heap | 大对象(如全表数据) | 微秒级
L3 | Redis集群 | 持久化缓存(如元数据) | 毫秒级
热点查询定义:短时间内被大量重复访问的数据查询请求。通常用途:社交平台热门帖子、实时监控数据。
- 无锁跳表索引(ConcurrentSkipListMap)
- 定义:基于跳表(Skip List)实现的并发有序数据结构,无锁设计减少线程竞争。
- 项目用途:替代传统B+树索引,提升高并发下的范围查询效率。
- 通常用途:实时排行榜、时间序列数据库。
示例代码:
ConcurrentNavigableMap<Integer, String> map = new ConcurrentSkipListMap<>();
map.put(1, "Data1"); // 线程安全写入
- 范围查询
- 定义:查询某一区间内的数据(如时间范围、ID区间)。
- 项目用途:利用跳表索引快速定位数据,提升查询性能。
- 通常用途:日志分析、订单历史查询。
- HikariCP连接池
- 高性能数据库连接池,提供快速的连接获取和释放。适用于任何需要高效数据库访问的Java应用。
- 项目用途:管理数据库连接,减少连接建立开销,提升写入吞吐量。
优化对比:
指标 | 原生JDBC | HikariCP
连接创建时间 | 150ms/次 | 2ms/次
最大并发连接数 | 100 | 1000+
配置示例:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost/db");
config.setMaximumPoolSize(20); // 关键参数
HikariDataSource ds = new HikariDataSource(config);
写入吞吐量:衡量系统每秒处理写入操作的能力。
- 测量方法:通过基准测试工具(如SysBench)模拟批量写入,监控TPS(每秒事务数)。
- 项目测试:结合HikariCP连接池优化和无锁结构,压测批量插入操作。
- 合理范围:依赖磁盘IO和网络带宽,SSD环境下通常可达数千TPS,需通过连接池和批量提交优化。
内存锁
- 内存锁(如mlock())用于将进程的虚拟内存页面锁定在物理内存(RAM)中,防止其被交换到磁盘。例如,实时应用或涉及敏感数据(如密码、密钥)的场景需要内存锁,确保数据访问的低延迟和安全性。
- 锁定内容: 以页面(通常4KB)为粒度锁定,无法单独锁定同一页面内的不同数据结构。多个进程共享同一物理页面时,只要任一进程持有锁,页面将保持驻留。
- 与互斥锁的区别: 内存锁针对物理内存管理,而互斥锁(如pthread_mutex)用于协调多线程/进程对共享资源的访问。
连接池
- 连接池通过预创建并复用资源(如数据库连接、网络连接)来提升性能。其核心是通过互斥锁(如数组lock[N])管理连接资源的分配。
- 锁定内容: 每个连接对应一个锁,线程需获取锁才能使用连接,防止多个线程同时操作同一连接导致数据混乱。
- 连接对象: 管理的是外部资源(如数据库服务),通过复用已建立的连接减少频繁创建/销毁的开销。
进程与应用程序/客户端的关系
- 进程不等同于应用程序或客户端。一个应用程序可由多个进程组成(如Nginx多进程架构),而一个进程也可服务于多个客户端(如多线程服务器)。客户端通常对应一个网络会话,可能由单个进程处理(如单线程服务器)或多个进程/线程协作处理(如负载均衡)。
微服务服务器中的端口处理机制
- 端口绑定与监听:每个进程通过bind()系统调用绑定到特定端口,同一协议下端口同一时间仅能被一个进程占用。例如,Web服务器监听80端口。
- 多进程共享端口: 如Nginx多进程通过自旋锁或文件锁避免“惊群效应”,仅一个进程实际调用accept()处理新连接。
- 微服务的负载均衡:客户端(如Feign)通过轮询、随机等策略将请求分发到不同端口的服务实例,实现水平扩展。反向代理(如Nginx)监听统一端口,内部转发请求至多个后端微服务端口,对外隐藏复杂度。
总结
- 内存锁锁定物理内存页,防止交换;连接池锁定池内资源,确保线程安全。进程是资源分配单位,一个应用可包含多进程,客户端连接可能由多进程协作处理。微服务端口通过绑定、锁机制及负载均衡策略高效处理客户端请求,支持高并发与可扩展性。
- 项目中通过响应式架构(WebFlux)和三级缓存支撑高QPS,利用无锁跳表索引和HikariCP提升查询与写入效率,StampedLock优化读多写少场景的并发控制。指标(QPS、吞吐量)需通过压力测试和监控工具验证,合理范围取决于硬件与代码优化程度。
GraphQL与RESTful API/SQL的关系及使用区别
- GraphQL:客户端自定义返回字段(如
{ user { id, name } }
),返回 JSON 格式数据。ORM(如 Hibernate) :将数据库表映射为 Java 对象,执行固定查询。 - 定位:GraphQL 位于 API 层(替代 REST),ORM 位于持久层(数据库操作)。
GraphQL与数据库查询的区别:
REST与GraphQL共存可行性
技术兼容性:
Spring Boot项目可同时支持REST和GraphQL,两者通过不同端点(如/api
和/graphql
)隔离,无冲突。
@RestController // REST端点
public class UserController { ... } @Component // GraphQL解析器
public class UserResolver { ... }
-
SQL:用于直接操作数据库的查询语言,关注数据存储与检索。
-
RESTful API:通过多端点(如
/users
、/posts
)操作资源,数据格式固定。 -
GraphQL:一种API查询语言,客户端通过单一端点(如
/graphql
)自定义查询字段,实现按需获取数据。GraphQL可替代或补充REST API,但需通过后端服务(如Spring Boot)与数据库(如SQL)交互。查询示例对比
场景:获取用户信息及其关联的帖子。RESTful API:需发送两次请求(
GET /users/1
和GET /posts?userId=1
),返回固定字段。
GraphQL:单次请求返回仅包含所需字段的JSON,客户端指定字段(如仅需用户姓名和帖子标题):query { user(id: 1) { name } posts(userId: 1) { title } }
代码与部署区别
REST:需定义多个控制器(如UserController
、PostController
),每个接口独立实现;客户端需处理多请求逻辑。GraphQL:定义统一的Schema(类型系统),通过解析器(Resolver)实现字段逻辑;客户端自由组合查询。部署:REST需管理多个端点版本(如/v1/users
),GraphQL通过Schema演进避免版本号。 -
框架兼容性:GraphQL不限于Spring Boot,支持Node.js(Apollo Server)、Python(Graphene)、Go(gqlgen)等。
GraphQL与RESTful的核心区别:
- 数据控制权:REST由服务端决定返回数据,客户端无法过滤冗余字段。GraphQL由客户端声明需求,减少网络传输。
- 请求效率:REST的N+1问题(如获取用户及其帖子需多次请求)。GraphQL单请求嵌套查询,减少网络开销。
- 版本管理:REST需通过URL版本化(如
/v2/users
)适应需求变化。GraphQL通过扩展Schema字段,保持接口兼容性。 - 缓存机制:REST利用HTTP缓存(如ETag),GraphQL需自定义缓存策略(如Apollo Client)。
GraphQL兼容性:既可以用 Spring Boot(Java) 也可以用 Flask/FastAPI(Python) 实现。它是一个独立的 API 查询语言。
@RestController
public class GraphQLController {@PostMapping("/graphql")public String executeGraphQL(@RequestBody String query) {return "GraphQL Response";}
}
import grapheneclass Query(graphene.ObjectType):hello = graphene.String()def resolve_hello(root, info):return "Hello, World!"schema = graphene.Schema(query=Query)
- FastAPI:兼容异步库(如
asyncpg
),不兼容同步阻塞代码。 - Flask:兼容传统同步库(如
SQLAlchemy
)。 - Spring Boot:兼容主流数据库(MySQL、PostgreSQL)和 ORM(JPA/Hibernate)。
- GraphQL:可与任何后端语言和数据库配合使用。
Spring Data JPA 与其他组件的关系
-
Spring Data JPA 封装 -> Hibernate 封装 -> JDBC
JDBC 是 Java 操作数据库的底层规范,提供基础的 SQL 执行能力,但需要开发者手动处理连接、事务等细节。而 JPA(Java Persistence API) 是更高层次的持久化规范,通过 ORM(对象关系映射)技术将对象与数据库表关联,简化了数据库操作。Spring Data JPA 是基于 JPA 的抽象层,进一步封装了 JPA 的实现(如 Hibernate),提供了更简洁的接口(如CrudRepository
),开发者只需定义接口即可自动生成 CRUD 操作。 -
Spring Data JPA 是持久层,属于 MVC 的 Model 层,为 Service 层提供数据访问能力,而 Service 层被 Control 层调用:Controller 接收 HTTP 请求 → 调用 Service 方法 → Service 调用 Repository 接口操作数据库 → 返回结果给前端。
-
Java 持久化框架主要分为两类:以 SQL 为核心:如 MyBatis,需手动编写 SQL,灵活性高但代码量大。ORM 框架:如 Hibernate(JPA 实现)、Spring Data JPA。
Spring Data JPA 的定位:ORM ,底层通常依赖 Hibernate。封装了 JPA 的通用操作(如分页、排序),并支持多种数据库(如 MySQL、PostgreSQL)。相比原生 Hibernate:Spring Data JPA 进一步简化了 DAO 层代码(无需实现接口)
#### REST API 不是 Spring Boot 专属,前端可以调用 REST API,但不能开发 REST API。GraphQL 在 API 层,而 ORM 在持久层,它们不是绑定关系,REST API 和 GraphQL 都可以使用 ORM。JDBC 并不限于 REST API,也可以用于普通 Java 应用, Hibernate 只是封装了 JDBC GraphQL 返回 JSON,但仍然可以查询 SQL 数据库,SQL 数据库的底层存储格式取决于具体数据库(MySQL、PostgreSQL 等)。
0. GraphQL与SQL的关系:二者不是一码事儿,SQL是DAO层的底端再底端。GraphQL和JDBC 才是二选一不兼容,二者是API 层的两种选择。
- GraphQL是API查询语言,用于定义客户端所需的数据结构;SQL是数据库查询语言,用于操作关系型数据。GraphQL服务通过ORM生成SQL语句访问数据库。
JSON存储与GraphQL无必然关联:GraphQL返回的数据格式通常是JSON,但数据存储方式可以是关系型数据库(如MySQL)、文档数据库(如MongoDB)等。例如:
- 若数据存储为JSON(如MongoDB),GraphQL可直接查询该JSON;
- 若数据存储为关系型数据库,GraphQL可通过ORM或JDBC转换为JSON返回。
- SQL数据库的底层格式:关系型数据库(如MySQL、Oracle)以表结构存储数据,底层文件格式为二进制(如InnoDB的
.ibd
文件),与JSON无关。数据库引擎负责将表数据转换为磁盘上的特定格式。
1.REST API 并不局限于 Spring Boot,它是风格,不依赖于特定框架。常见的 REST API 实现包括:
-
Node.js:Express.js + Express.Router +
fetch()
/ Axios -
Python:Flask + Flask-RESTful / Django REST framework
-
Go:Gin / Echo
-
PHP:Laravel API / Symfony API
REST API 能用于前端开发吗?REST API 本身是后端提供的接口,前端只能调用 REST API。例如:
fetch("https://api.example.com/user/1").then(response => response.json()).then(data => console.log(data));
如果你的问题是“前端能否实现 REST API”,答案是可以,例如使用 Node.js (Express.js) 搭建一个 REST API 服务器。
GraphQL 也是后端提供的 API,前端不能开发 GraphQL 服务器,但可以使用 GraphQL 进行数据查询。例如:
const query = `query {user(id: 1) {idname}}
`;fetch("https://api.example.com/graphql", {method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify({ query })
}).then(response => response.json()).then(data => console.log(data));
3. API 层不一定必须在 GraphQL 和 REST API 里二选一,有些项目会同时使用它们。例如:公共 API 使用 REST:如 GET /users/{id} 。
内部管理系统使用 GraphQL:如 { user(id: 1) { id, name, email } }
ORM 和 JDBC 是两种持久化层方式,ORM 内部还是调用 JDBC:JDBC:直接写 SQL,手动管理数据库连接和查询。ORM(如 Hibernate)封装 JDBC 。
4. JDBC可以用于任何JAVA,无论是REST API 和独立应用
JDBC 支持任何JAVA代码访问数据库,传统 Java 应用 也可以使用 JDBC ,例如:
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
另外,Spring Boot + JDBC 可以用于 REST API,也可以用于内部任务(如数据迁移)。
5. ORM 层 = DAO 层,API 层 = Conroller + Service,Hibernate 作为一种 ORM,可以被任何 API 类型(GraphQL 或 REST API )调用
- GraphQL 查询:
后台(Spring Boot + Hibernate):query {user(id: 1) {idname} }
@Query("SELECT u FROM User u WHERE u.id = :id") User findUserById(@Param("id") Long id);
- REST API 查询:
@GetMapping("/users/{id}") public User getUser(@PathVariable Long id) {return userRepository.findById(id).orElseThrow(); }
5. GraphQL 返回的是 JSON,但和 SQL 是兼容的:GraphQL 只是 API 层,它本身不存储数据,只是查询数据库(SQL 或 NoSQL)
- 后端使用 GraphQL 查询时,仍然执行 SQL。例如:
后台实际执行的 SQL:query {user(id: 1) {nameemail} }
SELECT name, email FROM users WHERE id = 1;
SQL 数据库的底层存储格式取决于数据库:
-
MySQL:InnoDB(B+树索引)、MyISAM(索引+数据分离存储)。PostgreSQL:采用 MVCC(多版本并发控制)。Oracle:数据块(Data Blocks)、数据文件(Data Files)。
-
JSON 存储 ≠ GraphQL:JSON 存储(如 PostgreSQL
jsonb
、MongoDB)只是数据格式,不等于 GraphQL
6. Spring JDBC 和 传统 JDBC
Spring JDBC (JdbcTemplate
) 是对传统 JDBC 的封装,简化了数据库操作,避免了 Connection
、PreparedStatement
和 ResultSet
处理。下面以 "新增"(INSERT)和 "修改"(UPDATE)操作 为例,展示它们在 Spring JDBC 和 传统 JDBC 下的实现方式。
传统 JDBC 示例:需要手动管理 Connection
,确保资源正确释放。编写 SQL 语句并设置参数。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TraditionalJDBCExample {private static final String URL = "jdbc:mysql://localhost:3306/mydb";private static final String USER = "root";private static final String PASSWORD = "password";// 插入数据public void insertUser(String name, int age) {String sql = "INSERT INTO users (name, age) VALUES (?, ?)";try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);PreparedStatement stmt = conn.prepareStatement(sql)) {stmt.setString(1, name);stmt.setInt(2, age);stmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 更新数据public void updateUser(int id, String name, int age) {String sql = "UPDATE users SET name = ?, age = ? WHERE id = ?";try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);PreparedStatement stmt = conn.prepareStatement(sql)) {stmt.setString(1, name);stmt.setInt(2, age);stmt.setInt(3, id);stmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}
}
Spring JDBC 提供 JdbcTemplate
,JdbcTemplate
负责管理数据库连接,简化 Connection
和 PreparedStatement
处理。自动处理 SQL 执行、异常捕获,避免资源泄露。
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;@Repository
public class SpringJDBCExample {private final JdbcTemplate jdbcTemplate;public SpringJDBCExample(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 插入数据public void insertUser(String name, int age) {String sql = "INSERT INTO users (name, age) VALUES (?, ?)";jdbcTemplate.update(sql, name, age);}// 更新数据public void updateUser(int id, String name, int age) {String sql = "UPDATE users SET name = ?, age = ? WHERE id = ?";jdbcTemplate.update(sql, name, age, id);}
}
Spring JDBC + GraphQL vs Hibernate + GraphQL
区别在于持久化层:Spring JDBC 仍是jdbc,直接执行 SQL 查询。Hibernate属于orm,通过 JPA (Java Persistence API) 进行对象映射,省去了 SQL 编写。
Spring JDBC 用 JdbcTemplate
直接查询数据库:
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;@Repository
public class UserRepository {private final JdbcTemplate jdbcTemplate;public UserRepository(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 查询用户public List<User> getUsers() {String sql = "SELECT id, name, age FROM users";return jdbcTemplate.query(sql, new UserRowMapper());}// 插入用户public void insertUser(User user) {String sql = "INSERT INTO users (name, age) VALUES (?, ?)";jdbcTemplate.update(sql, user.getName(), user.getAge());}
}// 手动映射结果集到对象
class UserRowMapper implements RowMapper<User> {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {return new User(rs.getInt("id"), rs.getString("name"), rs.getInt("age"));}
}
GraphQL 解析器(Controller)
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
import java.util.List;@Controller
public class UserGraphQLController {private final UserRepository userRepository;public UserGraphQLController(UserRepository userRepository) {this.userRepository = userRepository;}@QueryMappingpublic List<User> getUsers() {return userRepository.getUsers();}
}
Hibernate + GraphQL 示例
使用 Spring Data JPA (基于 Hibernate),GraphQL 直接调用 JpaRepository
进行查询:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;// 使用 JPA 方式操作数据库
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
}
实体类(Hibernate ORM 映射)
import jakarta.persistence.*;@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private int id;private String name;private int age;// 构造方法和 Getter/Setter 省略
}
GraphQL 解析器(Controller)
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
import java.util.List;@Controller
public class UserGraphQLController {private final UserRepository userRepository;public UserGraphQLController(UserRepository userRepository) {this.userRepository = userRepository;}@QueryMappingpublic List<User> getUsers() {return userRepository.findAll();}
}
相关文章:
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
WebFlux 定义:Spring 5引入的响应式Web框架,基于Reactor库实现非阻塞、异步编程模型。通常用途:构建实时通信、流数据处理等高并发场景。使用异步事件驱动模型,单线程可处理数千并发连接。用途:处理高并发网络请求&am…...
QSNCTF-WEB做题记录
第一题,文章管理系统 来自 <天狩CTF竞赛平台> 描述:这是我们的文章管理系统,快来看看有什么漏洞可以拿到FLAG吧?注意:可能有个假FLAG哦 1,首先观察题目网站的结构和特征 这个一个文件管理系统&#x…...
使用Dify将AI机器人嵌入到你的前端页面中及chrome的扩展应用
目录 1 博主有话说2 前提环境3 Dify创建个聊天助手应用4 将AI聊天机器人嵌入到html中5 将AI聊天机器人设置为chrome的扩展应用6 博主增语 1 博主有话说 那博主话不多说,先展示一下成果! 这个界面是使用dify配置的一个“聊天助手”的应用,助…...
接口测试-API测试中常用的协议(下)
一、RPC RPC(Remote Procedure Call)即远程过程调用协议,它允许程序调用位于其他计算机上的程序中的过程或函数,就像调用本地程序中的过程一样。下面从其概念、工作原理、特点、应用场景等方面详细介绍: 概念起源与核…...
【git】提交修改、回撤、回滚、Tag 操作讲解,与reset (--soft、--mixed、--hard) 的区别
Git 提交修改、回撤、回滚、Tag 操作详解 1. git commit --amend -m "message" 作用:修改最近一次提交的信息或内容。 适用场景: 提交后发现 commit message 写错了。提交后发现 少 add 了文件,想直接加进上一次提交。 示例 1&…...
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
Embedding模型介绍部署部署
概述 是一种将高维数据(如文本、图像、音频)映射到低维空间的技术,其中每个数据点由实数构成的向量表示,这些向量在向量空间中的位置反映了数据的语义特征。这种技术广泛应用于自然语言处理和机器学习中,使得计…...
web网络安全:跨站脚本攻击(XSS)
跨站脚本攻击(XSS)概述 跨站脚本攻击(XSS,Cross-Site Scripting) 是一种常见的 Web 安全漏洞,攻击者通过向受信任的网站注入恶意脚本(通常是 JavaScript),诱使其他用户在…...
【C++】 Flow of Control
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…...
Kafka中commitAsync的使用与实例解析
在使用Apache Kafka进行消息处理时,正确管理偏移量(offset)是确保数据一致性和可靠性的重要环节。Kafka提供了多种方式来提交偏移量,其中commitAsync()方法是一种高效且灵活的选择。本文将通过一个完整的实例,详细介绍…...
上海餐饮冷藏配送全方案 一站式服务助企提速发展
在上海这座国际化大都市中,餐饮行业以其繁荣与多元著称。消费者对食品安全和品质要求的日益提高,餐饮冷链运输成为了保障餐饮供应链稳定、高效的关键环节。近日,华鼎冷链科技凭借其创新的一站式服务方案,在上海餐饮冷链领域脱颖而…...
基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频
本系统包含用户、管理员两个角色。 用户角色:注册登录、查看首页电影信息推荐、查看电影详情并进行收藏预定、查看电影资讯、在线客服、管理个人订单等。 管理员角色:登录后台、管理电影类型、管理放映厅信息、管理电影信息、管理用户信息、管理订单等。…...
Java 面试笔记 - Java基础
1 、JDK、JRE 和 JVM 是 Java 开发与运行环境中的三个核心组件,它们之间的关系和区别如下: 1. JDK (Java Development Kit) 定义:JDK 是 Java 开发工具包,包含了开发 Java 应用程序所需的所有工具和库。包含内容: 编…...
基于MFC实现的键盘电子乐器演奏程序
基于MFC实现的键盘电子乐器演奏程序设计 1.项目简介 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱,使用其蜂鸣器发声,若不连接,程序会直接播放 mp3 文件模拟钢琴声。 请在 release 处下载编译好的 exe 文件运行,如需计…...
支持批量导出的软件,效率拉满!
今天给大家分享一款超实用的软件,它能帮你批量导出PPT里的图片,简直是提升工作效率的神器! PPT转jpg PPT逐页导出为图片 这款软件超级简单易用,打开就能直接上手,不需要复杂的设置。 这个软件有三种功能, …...
AI前端开发:职业晋升的加速器
在数字经济时代,前端开发领域正在经历一场由人工智能 (AI) 技术驱动的深刻变革。掌握AI技能,已不再是锦上添花,而是成为前端工程师职业晋升的关键竞争力。本文将探讨AI写代码工具等AI技术如何重塑前端开发职业路径,以及如何通过学…...
在mfc中使用自定义三维向量类和计算多个三维向量的平均值
先添加一个普通类, Vector3.h, // Vector3.h: interface for the Vector3 class. // //#if !defined(AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_) #define AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_#if _MSC_VER > 1000 #p…...
RK3588配置成为路由器
文章目录 前言一、配置netplan二、安装hostapd1.创建hostapd.conf文件2.安装软件3.修改启动文件4.修改/etc/default/hostapd 文件 三、安装dnsmasq服务四、配置NET及重启验证五、常见问题总结 前言 RK3588开发板有两个网口,一个无线网卡。我需要配置为家用路由器模…...
力扣-回溯-40 组合总和Ⅱ
思路 需要实现树枝层面的去重,利用use数组来判别,如果前一个节点已经使用了,说明这是在往深处遍历了,允许重复,如果前一个节点没有使用且值相同的话,说明是在树枝上重复了 代码 class Solution { public…...
深入理解 Rust 中的 `Box<T>`:堆上的数据与递归类型
1. Box<T> 的基础知识 1.1 堆与栈的分工 在默认情况下,Rust 会将变量存储在栈上。然而,栈的空间有限,且对于大小未知或极大的数据来说,栈并不适用。使用 Box<T>,我们可以将数据存放在堆上,而…...
js原型和原型链,到底咋回事?
js原型和原型链,到底咋回事? js原型的原理 在 JavaScript 里,每个对象都有一个“隐藏的小伙伴”,这个“小伙伴”就是原型。可以把原型想象成一个模板或者一个仓库,对象能从它这个“小伙伴”那里借用一些属性和方法。…...
深入理解IP地址与端口:网络通信的基石
深入理解IP地址与端口:网络通信的基石 文章大纲 网络通信基础概念 1.1 什么是网络通信1.2 OSI模型与TCP/IP模型1.3 数据包传输原理 IP地址深度解析 2.1 IP地址定义与作用2.2 IPv4与IPv6对比2.3 子网划分与CIDR表示法2.4 公网IP与私网IP2.5 特殊IP地址详解 端口机…...
ubuntu系统本地部署deepseek
1、安装ollama 用Ollama部署deepseek模型,官网地址:https://ollama.com/download 根据官网给出的命令直接安装(安装linux版本) curl -fsSL https://ollama.com/install.sh | sh2、安装deepseek-r1模型 我这里用了8b,…...
nginx ngx_http_module(10) 指令详解
nginx ngx_http_module(10) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_v2_module:HTTP/2支持模块,允许Nginx通过HTTP/2协议与客户端进行通信。HTTP/2带来了许多性能优化,如多路复用、头部压缩和服务器推…...
rman 备份恢复1
前提: rman用户必须具有sysdba权限 使用常用连接方式如下: rman target / rman target sys/oracle rman target sys/oracleprod1 catalog dav/oracledav_db 一个rman连接会产生两个进程,action字段为空的就是rman的监控进程,另…...
BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的适用场景
在数据爬取中,BeautifulSoup、lxml/XPath和正则表达式的适用场景各有侧重,具体选择需根据数据特征和需求权衡: 1. BeautifulSoup(结合CSS选择器) 适用场景 简单结构页面:标签层级清晰、属性固定的HTML页面…...
Python装饰器本质250220
定义一个函数,在不修改这个函数的代码的情况下,让函数执行前后会有新的内容加入 def func():print("func")return def outer():def inner():print("new code before")func()print("new code after")returnreturn inner f…...
实时、分时、半实时半分时操作系统
在操作系统中,实时、分时、半实时半分时是三种不同的调度策略,它们决定了系统如何分配和管理CPU资源。以下是它们的定义和举例: 1. 实时操作系统(RTOS, Real-Time Operating System) 定义:实时操作系统是…...
玩转Docker | 使用Docker部署本地自托管reference速查表工具
玩转Docker | 使用Docker部署本地自托管reference速查表工具 前言一、Reference介绍Reference简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署reference服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问reference应用五、测试与…...
基于springboot校园健康系统的设计与实现(源码+文档)
大家好我是风歌,今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限,通…...
孤独症项目(1)
年也过了,也不能一直玩,该学习还是要学习。 过年前我算是把环境配置好,然后把项目跑起来了,现在的问题是我看不懂这个代码什么意思 代码还是要一行一行看,每一行都看懂了,全文自然就知道了 1 from pathlib…...
DeepSeek 冲击(含本地化部署实践)
DeepSeek无疑是春节档最火爆的话题,上线不足一月,其全球累计下载量已达4000万,反超ChatGPT成为全球增长最快的AI应用,并且完全开源。那么究竟DeepSeek有什么魔力,能够让大家趋之若鹜,他又将怎样改变世界AI格…...
《被讨厌的勇气》(七)
1.共同体感觉是幸福的人际关系的最重要的指标。 2.把对自己的执著变成对他人的关心。 3.不能进行“课题分离”、一味拘泥于认可欲求的人也是及其以自我为中心的人。 4.一味在意“他人怎么看”的生活方式正式只关心“我”的自我中心式的生活方式。 5.别人并不是为了满足你的期待…...
【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用
在日常办公和学习中,将Word文档转换为PDF格式的需求非常普遍。无论是制作简历、撰写报告还是分享文件,都需要确保文档格式在不同设备上保持一致。而小白工具的“Word转PDF”功能正是为此需求量身打造的一款高效解决方案。 【Word转PDF】在线Doc/Docx转换…...
SpringCloud面试题----eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别
dEureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们的区别主要体现在以下几个方面: 设计理念 Eureka:是基于 RESTful 风格设计的,强调简单、轻量级,旨在为微服务架构提供一种易于使用的服务发现解决方案,注重服务的可用性和灵活性。Zookeeper:最初是为分布式协…...
Matplotlib中strpdate2num()函数报错的解决方法
在Matplotlib绘图时,有时会从文件中读取形如“2025/2/20”格式的日期数据,在读取了日期数据后,会通过Matplotlib.dates.strpdate2num()函数将日期格式变为浮点数进行绘制。 1 matplotlib.dates不再支持strpdate2num()函数 使用matplotlib.d…...
easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题
需求背景:有一个需求要做下拉框的值有100多条,同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出,会出现下拉框的值过多,导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本:<depende…...
Java链表全解析:从单向链表到双向链表的实现与优化
一、链表的核心特性 链表是一种通过 节点 存储数据的线性数据结构,每个节点包含 数据域 和 指针域。节点在内存中 不连续存储,通过指针串联。 1.单向链表 2.双向链表 3.环形链表 环形单链表 环形双链表 4.链表的类型 类型结构描述典型应用场景单向链表每个节点只有 一个指…...
《动手学机器人学》笔记
目录 0.介绍1.概述|空间位置、姿态的描述(33)|《动手学机器人学》2.(2)-Robotics Toolbox①(V10.4)3.齐次坐标与变换矩阵4.一般形式的旋转变换矩阵5.(轴角法)…...
【小游戏】C++控制台版本俄罗斯轮盘赌
制作团队:洛谷813622(Igallta) 989571(_ayaka_) Mod:_ayaka_ 双人模式:Igallta 公告: 原先的9.8改名为 Alpha 1.0,以后每次更新都增加 0.1。 Alpha 1.11 改为 Beta 1…...
最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程
👨💻群里有同学是做影视赛道的博主,听说最近DeepSeek这么火,咨询能不能用DeepSeek写影评,并整理电影数据资料,自动发布到飞书文档,把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...
Java集合框架之ArrayList解析
目录 一、ArrayList概述 二、优缺点分析 三、底层数据结构 四、源码分析ArrayList初始化容量 五、源码分析ArrayList扩容策略 六、ArrayList集合源码分析 1. 属性分析 2. 构造方法分析 无参构造方法 指定初始容量的构造方法 传入集合的构造方法 3. 添加元素 add(E…...
idea 2023.3.7常用插件
idea 2023.3.7常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2023.3.7常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl;”,键入一个字符,然后在Ace …...
IM聊天系统架构实现
一、IM系统整体架构 二、企业级IM系统如何实现心跳与断线重连机制; 1、重连机制(服务端下线) 服务端下线,客户端netty可以感知到,在感知的方法中进行重连的操作,注意重连可能连接到旧的服务器继续报错&…...
vue3可选链操作符(?.)
一、定义: 可选链操作符(?.)是 JavaScript 中的一个语法,用于安全地访问对象的属性,即使该对象为 null 或 undefined,也不会抛出错误,而是返回 undefined。 1、不使用可选链操作符࿱…...
科普:Docker run的相关事项
一、镜像名(含标签)太长 如,通过如下命令行: docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名(及标签)太长,可以通过改名的方法变短。 在 Docker 中&…...
petalinux高版本设置自动登录和开机自启动配置
petalinux-config -c rootfs 依次选择 Image Features -> serial-autologin-root 这是配置 进来就是root权限 创建并安装名为 myapp-init 的新建应用程序 petalinux-create -t apps --template install -n myapp-init --enable 编辑 project-spec/meta-user/recipes-…...
算法刷题-哈希表的总结
什么时候用数组、什么时候用map呢? 经常会混淆。 混淆1:例如有时候题目可能要求在一大堆元素里找目标元素,要求不能利用用过的字母,这就会让我想到只包含一个键值的set或者是map,但实际上忽略了字母(限定大…...
如何通过 Homebrew 安装 Qt 并配置环境变量
如何通过 Homebrew 安装 Qt 并配置环境变量 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形界面应用。本文将详细介绍如何在 macOS 上通过 Homebrew 安装 Qt 并配置环境变量,以便在终端和 Qt Creator 中使用 Qt 工具。 步骤 1:安装 Ho…...
RESTful 的特点与普通 Web API 的区别
RESTful 是一种设计风格,而不仅仅是普通的 Web API。它遵循一些特定的原则和约束,使得 API 更加简洁、可扩展和易于理解。以下是 RESTful 的特点,以及与普通 Web API 的区别: RESTful 的特点 1. 资源导向 RESTful API 的核心是资…...