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

Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)

  1. WebFlux
  • 定义:Spring 5引入的响应式Web框架,基于Reactor库实现非阻塞、异步编程模型。通常用途:构建实时通信、流数据处理等高并发场景。使用异步事件驱动模型,单线程可处理数千并发连接。
  • 用途:处理高并发网络请求(如2000+ QPS),提升数据库服务器的吞吐量,适用于IO密集型操作。

示例代码:

@RestController
public class UserController {@GetMapping("/users")public Flux<User> getUsers() {return userRepository.findAll(); // 返回响应式数据流}
}
  1. 响应式架构
  • 定义:基于事件驱动和非阻塞IO的架构,资源利用率高,适合高并发场景。通常用途:微服务网关、实时数据处理系统。
  • 项目用途:支撑数据库服务器的网络通信模块,确保高QPS下仍能快速响应请求。
  • QPS(每秒查询数)测量方法:使用JMeter、Gatling等压力测试工具模拟并发请求。通过WebTestClient发送批量请求,监控响应时间和成功率。
  • 合理范围:取决于硬件和业务复杂度,2000+ QPS属于高性能水平,需结合缓存、非阻塞IO等优化实现。
  1. 三级缓存体系(Caffeine + OffHeap + Redis)
  • 堆内缓存(Caffeine):基于Java堆的高性能本地缓存,适合频繁访问的热点数据。通常用途:电商秒杀、实时排行榜等高频读场景。
  • 堆外缓存(OffHeap):使用Direct Memory存储数据,减少GC压力,适合大对象。
  • Redis集群:分布式缓存,保证数据一致性和高可用性。

层级 | 技术 | 存储内容 | 访问时间
L1 | Caffeine | 热点数据(如最近查询结果) | 纳秒级
L2 | Off-Heap | 大对象(如全表数据) | 微秒级
L3 | Redis集群 | 持久化缓存(如元数据) | 毫秒级

热点查询定义:短时间内被大量重复访问的数据查询请求。通常用途:社交平台热门帖子、实时监控数据。

  1. 无锁跳表索引(ConcurrentSkipListMap)
  • 定义:基于跳表(Skip List)实现的并发有序数据结构,无锁设计减少线程竞争。
  • 项目用途:替代传统B+树索引,提升高并发下的范围查询效率。
  • 通常用途:实时排行榜、时间序列数据库。

示例代码:

ConcurrentNavigableMap<Integer, String> map = new ConcurrentSkipListMap<>();
map.put(1, "Data1"); // 线程安全写入
  1. 范围查询
  • 定义:查询某一区间内的数据(如时间范围、ID区间)。
  • 项目用途:利用跳表索引快速定位数据,提升查询性能。
  • 通常用途:日志分析、订单历史查询。
  1. 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/1GET /posts?userId=1),返回固定字段。
    GraphQL:单次请求返回仅包含所需字段的JSON,客户端指定字段(如仅需用户姓名和帖子标题):

    query {  user(id: 1) { name }  posts(userId: 1) { title }  
    }
    

    代码与部署区别
    REST:需定义多个控制器(如UserControllerPostController),每个接口独立实现;客户端需处理多请求逻辑。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 与其他组件的关系
    1. Spring Data JPA 封装 ->  Hibernate 封装 -> JDBC 

      JDBC 是 Java 操作数据库的底层规范,提供基础的 SQL 执行能力,但需要开发者手动处理连接、事务等细节。而 JPA(Java Persistence API) 是更高层次的持久化规范,通过 ORM(对象关系映射)技术将对象与数据库表关联,简化了数据库操作。Spring Data JPA 是基于 JPA 的抽象层,进一步封装了 JPA 的实现(如 Hibernate),提供了更简洁的接口(如 CrudRepository),开发者只需定义接口即可自动生成 CRUD 操作。

    2. Spring Data JPA 是持久层,属于 MVC 的 Model 层,为 Service 层提供数据访问能力,而 Service 层被 Control 层调用:Controller 接收 HTTP 请求 → 调用 Service 方法 → Service 调用 Repository 接口操作数据库 → 返回结果给前端。

    3. 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 APIGraphQL 在 API 层,而 ORM 在持久层,它们不是绑定关系,REST API 和 GraphQL 都可以使用 ORMJDBC 并不限于 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 查询
      query {user(id: 1) {idname}
      }
      
      后台(Spring Boot + Hibernate)
      @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。例如:
      query {user(id: 1) {nameemail}
      }
      
      后台实际执行的 SQL
      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 的封装,简化了数据库操作,避免了 ConnectionPreparedStatementResultSet 处理。下面以 "新增"(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 提供 JdbcTemplateJdbcTemplate 负责管理数据库连接,简化 ConnectionPreparedStatement 处理。自动处理 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 定义&#xff1a;Spring 5引入的响应式Web框架&#xff0c;基于Reactor库实现非阻塞、异步编程模型。通常用途&#xff1a;构建实时通信、流数据处理等高并发场景。使用异步事件驱动模型&#xff0c;单线程可处理数千并发连接。用途&#xff1a;处理高并发网络请求&am…...

    QSNCTF-WEB做题记录

    第一题&#xff0c;文章管理系统 来自 <天狩CTF竞赛平台> 描述&#xff1a;这是我们的文章管理系统&#xff0c;快来看看有什么漏洞可以拿到FLAG吧&#xff1f;注意&#xff1a;可能有个假FLAG哦 1&#xff0c;首先观察题目网站的结构和特征 这个一个文件管理系统&#x…...

    使用Dify将AI机器人嵌入到你的前端页面中及chrome的扩展应用

    目录 1 博主有话说2 前提环境3 Dify创建个聊天助手应用4 将AI聊天机器人嵌入到html中5 将AI聊天机器人设置为chrome的扩展应用6 博主增语 1 博主有话说 那博主话不多说&#xff0c;先展示一下成果&#xff01; 这个界面是使用dify配置的一个“聊天助手”的应用&#xff0c;助…...

    接口测试-API测试中常用的协议(下)

    一、RPC RPC&#xff08;Remote Procedure Call&#xff09;即远程过程调用协议&#xff0c;它允许程序调用位于其他计算机上的程序中的过程或函数&#xff0c;就像调用本地程序中的过程一样。下面从其概念、工作原理、特点、应用场景等方面详细介绍&#xff1a; 概念起源与核…...

    【git】提交修改、回撤、回滚、Tag 操作讲解,与reset (--soft、--mixed、--hard) 的区别

    Git 提交修改、回撤、回滚、Tag 操作详解 1. git commit --amend -m "message" 作用&#xff1a;修改最近一次提交的信息或内容。 适用场景&#xff1a; 提交后发现 commit message 写错了。提交后发现 少 add 了文件&#xff0c;想直接加进上一次提交。 示例 1&…...

    【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)

    &#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

    Embedding模型介绍部署部署

    概述 是一种将高维数据&#xff08;如‌文本、图像、音频&#xff09;映射到低维空间的技术&#xff0c;其中每个数据点由实数构成的向量表示&#xff0c;这些向量在向量空间中的位置反映了数据的语义特征。这种技术广泛应用于‌自然语言处理和‌机器学习中&#xff0c;使得计…...

    web网络安全:跨站脚本攻击(XSS)

    跨站脚本攻击&#xff08;XSS&#xff09;概述 跨站脚本攻击&#xff08;XSS&#xff0c;Cross-Site Scripting&#xff09; 是一种常见的 Web 安全漏洞&#xff0c;攻击者通过向受信任的网站注入恶意脚本&#xff08;通常是 JavaScript&#xff09;&#xff0c;诱使其他用户在…...

    【C++】 Flow of Control

    《C程序设计基础教程》——刘厚泉&#xff0c;李政伟&#xff0c;二零一三年九月版&#xff0c;学习笔记 文章目录 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进行消息处理时&#xff0c;正确管理偏移量&#xff08;offset&#xff09;是确保数据一致性和可靠性的重要环节。Kafka提供了多种方式来提交偏移量&#xff0c;其中commitAsync()方法是一种高效且灵活的选择。本文将通过一个完整的实例&#xff0c;详细介绍…...

    上海餐饮冷藏配送全方案 一站式服务助企提速发展

    在上海这座国际化大都市中&#xff0c;餐饮行业以其繁荣与多元著称。消费者对食品安全和品质要求的日益提高&#xff0c;餐饮冷链运输成为了保障餐饮供应链稳定、高效的关键环节。近日&#xff0c;华鼎冷链科技凭借其创新的一站式服务方案&#xff0c;在上海餐饮冷链领域脱颖而…...

    基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频

    本系统包含用户、管理员两个角色。 用户角色&#xff1a;注册登录、查看首页电影信息推荐、查看电影详情并进行收藏预定、查看电影资讯、在线客服、管理个人订单等。 管理员角色&#xff1a;登录后台、管理电影类型、管理放映厅信息、管理电影信息、管理用户信息、管理订单等。…...

    Java 面试笔记 - Java基础

    1 、JDK、JRE 和 JVM 是 Java 开发与运行环境中的三个核心组件&#xff0c;它们之间的关系和区别如下&#xff1a; 1. JDK (Java Development Kit) 定义&#xff1a;JDK 是 Java 开发工具包&#xff0c;包含了开发 Java 应用程序所需的所有工具和库。包含内容&#xff1a; 编…...

    基于MFC实现的键盘电子乐器演奏程序

    基于MFC实现的键盘电子乐器演奏程序设计 1.项目简介 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱&#xff0c;使用其蜂鸣器发声&#xff0c;若不连接&#xff0c;程序会直接播放 mp3 文件模拟钢琴声。 请在 release 处下载编译好的 exe 文件运行&#xff0c;如需计…...

    支持批量导出的软件,效率拉满!

    今天给大家分享一款超实用的软件&#xff0c;它能帮你批量导出PPT里的图片&#xff0c;简直是提升工作效率的神器&#xff01; PPT转jpg PPT逐页导出为图片 这款软件超级简单易用&#xff0c;打开就能直接上手&#xff0c;不需要复杂的设置。 这个软件有三种功能&#xff0c; …...

    AI前端开发:职业晋升的加速器

    在数字经济时代&#xff0c;前端开发领域正在经历一场由人工智能 (AI) 技术驱动的深刻变革。掌握AI技能&#xff0c;已不再是锦上添花&#xff0c;而是成为前端工程师职业晋升的关键竞争力。本文将探讨AI写代码工具等AI技术如何重塑前端开发职业路径&#xff0c;以及如何通过学…...

    在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开发板有两个网口&#xff0c;一个无线网卡。我需要配置为家用路由器模…...

    力扣-回溯-40 组合总和Ⅱ

    思路 需要实现树枝层面的去重&#xff0c;利用use数组来判别&#xff0c;如果前一个节点已经使用了&#xff0c;说明这是在往深处遍历了&#xff0c;允许重复&#xff0c;如果前一个节点没有使用且值相同的话&#xff0c;说明是在树枝上重复了 代码 class Solution { public…...

    深入理解 Rust 中的 `Box<T>`:堆上的数据与递归类型

    1. Box<T> 的基础知识 1.1 堆与栈的分工 在默认情况下&#xff0c;Rust 会将变量存储在栈上。然而&#xff0c;栈的空间有限&#xff0c;且对于大小未知或极大的数据来说&#xff0c;栈并不适用。使用 Box<T>&#xff0c;我们可以将数据存放在堆上&#xff0c;而…...

    js原型和原型链,到底咋回事?

    js原型和原型链&#xff0c;到底咋回事&#xff1f; js原型的原理 在 JavaScript 里&#xff0c;每个对象都有一个“隐藏的小伙伴”&#xff0c;这个“小伙伴”就是原型。可以把原型想象成一个模板或者一个仓库&#xff0c;对象能从它这个“小伙伴”那里借用一些属性和方法。…...

    深入理解IP地址与端口:网络通信的基石

    深入理解IP地址与端口&#xff1a;网络通信的基石 文章大纲 网络通信基础概念 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模型&#xff0c;官网地址&#xff1a;https://ollama.com/download 根据官网给出的命令直接安装&#xff08;安装linux版本&#xff09; curl -fsSL https://ollama.com/install.sh | sh2、安装deepseek-r1模型 我这里用了8b&#xff0c…...

    nginx ngx_http_module(10) 指令详解

    nginx ngx_http_module(10) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 ngx_http_v2_module&#xff1a;HTTP/2支持模块&#xff0c;允许Nginx通过HTTP/2协议与客户端进行通信。HTTP/2带来了许多性能优化&#xff0c;如多路复用、头部压缩和服务器推…...

    rman 备份恢复1

    前提&#xff1a; rman用户必须具有sysdba权限 使用常用连接方式如下&#xff1a; rman target / rman target sys/oracle rman target sys/oracleprod1 catalog dav/oracledav_db 一个rman连接会产生两个进程&#xff0c;action字段为空的就是rman的监控进程&#xff0c;另…...

    BeautifulSoup、lxml/XPath和正则表达式在数据爬取中的适用场景

    在数据爬取中&#xff0c;BeautifulSoup、lxml/XPath和正则表达式的适用场景各有侧重&#xff0c;具体选择需根据数据特征和需求权衡&#xff1a; 1. BeautifulSoup&#xff08;结合CSS选择器&#xff09; 适用场景 简单结构页面&#xff1a;标签层级清晰、属性固定的HTML页面…...

    Python装饰器本质250220

    定义一个函数&#xff0c;在不修改这个函数的代码的情况下&#xff0c;让函数执行前后会有新的内容加入 def func():print("func")return def outer():def inner():print("new code before")func()print("new code after")returnreturn inner f…...

    实时、分时、半实时半分时操作系统

    在操作系统中&#xff0c;实时、分时、半实时半分时是三种不同的调度策略&#xff0c;它们决定了系统如何分配和管理CPU资源。以下是它们的定义和举例&#xff1a; 1. 实时操作系统&#xff08;RTOS, Real-Time Operating System&#xff09; 定义&#xff1a;实时操作系统是…...

    玩转Docker | 使用Docker部署本地自托管reference速查表工具

    玩转Docker | 使用Docker部署本地自托管reference速查表工具 前言一、Reference介绍Reference简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署reference服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问reference应用五、测试与…...

    基于springboot校园健康系统的设计与实现(源码+文档)

    大家好我是风歌&#xff0c;今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限&#xff0c;通…...

    孤独症项目(1)

    年也过了&#xff0c;也不能一直玩&#xff0c;该学习还是要学习。 过年前我算是把环境配置好&#xff0c;然后把项目跑起来了&#xff0c;现在的问题是我看不懂这个代码什么意思 代码还是要一行一行看&#xff0c;每一行都看懂了&#xff0c;全文自然就知道了 1 from pathlib…...

    DeepSeek 冲击(含本地化部署实践)

    DeepSeek无疑是春节档最火爆的话题&#xff0c;上线不足一月&#xff0c;其全球累计下载量已达4000万&#xff0c;反超ChatGPT成为全球增长最快的AI应用&#xff0c;并且完全开源。那么究竟DeepSeek有什么魔力&#xff0c;能够让大家趋之若鹜&#xff0c;他又将怎样改变世界AI格…...

    《被讨厌的勇气》(七)

    1.共同体感觉是幸福的人际关系的最重要的指标。 2.把对自己的执著变成对他人的关心。 3.不能进行“课题分离”、一味拘泥于认可欲求的人也是及其以自我为中心的人。 4.一味在意“他人怎么看”的生活方式正式只关心“我”的自我中心式的生活方式。 5.别人并不是为了满足你的期待…...

    【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用

    在日常办公和学习中&#xff0c;将Word文档转换为PDF格式的需求非常普遍。无论是制作简历、撰写报告还是分享文件&#xff0c;都需要确保文档格式在不同设备上保持一致。而小白工具的“Word转PDF”功能正是为此需求量身打造的一款高效解决方案。 【Word转PDF】在线Doc/Docx转换…...

    SpringCloud面试题----eureka和zookeeper都可以提供服务注册与发现的功能,请说说两个的区别

    dEureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们的区别主要体现在以下几个方面: 设计理念 Eureka:是基于 RESTful 风格设计的,强调简单、轻量级,旨在为微服务架构提供一种易于使用的服务发现解决方案,注重服务的可用性和灵活性。Zookeeper:最初是为分布式协…...

    Matplotlib中strpdate2num()函数报错的解决方法

    在Matplotlib绘图时&#xff0c;有时会从文件中读取形如“2025/2/20”格式的日期数据&#xff0c;在读取了日期数据后&#xff0c;会通过Matplotlib.dates.strpdate2num()函数将日期格式变为浮点数进行绘制。 1 matplotlib.dates不再支持strpdate2num()函数 使用matplotlib.d…...

    easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题

    需求背景&#xff1a;有一个需求要做下拉框的值有100多条&#xff0c;同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出&#xff0c;会出现下拉框的值过多&#xff0c;导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本&#xff1a;<depende…...

    Java链表全解析:从单向链表到双向链表的实现与优化

    一、链表的核心特性 链表是一种通过 节点 存储数据的线性数据结构,每个节点包含 数据域 和 指针域。节点在内存中 不连续存储,通过指针串联。 1.单向链表 2.双向链表 3.环形链表 环形单链表 环形双链表 4.链表的类型 类型结构描述典型应用场景单向链表每个节点只有 一个指…...

    《动手学机器人学》笔记

    目录 0.介绍1.概述&#xff5c;空间位置、姿态的描述&#xff08;33&#xff09;&#xff5c;《动手学机器人学》2.&#xff08;2&#xff09;-Robotics Toolbox①&#xff08;V10.4&#xff09;3.齐次坐标与变换矩阵4.一般形式的旋转变换矩阵5.&#xff08;轴角法&#xff09;…...

    【小游戏】C++控制台版本俄罗斯轮盘赌

    制作团队&#xff1a;洛谷813622&#xff08;Igallta&#xff09; 989571&#xff08;_ayaka_&#xff09; Mod&#xff1a;_ayaka_ 双人模式&#xff1a;Igallta 公告&#xff1a; 原先的9.8改名为 Alpha 1.0&#xff0c;以后每次更新都增加 0.1。 Alpha 1.11 改为 Beta 1…...

    最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程

    &#x1f468;‍&#x1f4bb;群里有同学是做影视赛道的博主&#xff0c;听说最近DeepSeek这么火&#xff0c;咨询能不能用DeepSeek写影评&#xff0c;并整理电影数据资料&#xff0c;自动发布到飞书文档&#xff0c;把每天的工作做成一个自动化的流程。 那今天斜杠君就为大家…...

    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&#xff1b;”&#xff0c;键入一个字符&#xff0c;然后在Ace …...

    IM聊天系统架构实现

    一、IM系统整体架构 二、企业级IM系统如何实现心跳与断线重连机制&#xff1b; 1、重连机制&#xff08;服务端下线&#xff09; 服务端下线&#xff0c;客户端netty可以感知到&#xff0c;在感知的方法中进行重连的操作&#xff0c;注意重连可能连接到旧的服务器继续报错&…...

    vue3可选链操作符(?.)

    一、定义&#xff1a; 可选链操作符&#xff08;?.&#xff09;是 JavaScript 中的一个语法&#xff0c;用于安全地访问对象的属性&#xff0c;即使该对象为 null 或 undefined&#xff0c;也不会抛出错误&#xff0c;而是返回 undefined。 1、不使用可选链操作符&#xff1…...

    科普:Docker run的相关事项

    一、镜像名&#xff08;含标签&#xff09;太长 如&#xff0c;通过如下命令行&#xff1a; docker pull designthru2019/dify:56c6d1af0944dbdb5e0115cb623ff0e118a4ac62拉取的镜像名&#xff08;及标签&#xff09;太长&#xff0c;可以通过改名的方法变短。 在 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呢&#xff1f; 经常会混淆。 混淆1&#xff1a;例如有时候题目可能要求在一大堆元素里找目标元素&#xff0c;要求不能利用用过的字母&#xff0c;这就会让我想到只包含一个键值的set或者是map&#xff0c;但实际上忽略了字母&#xff08;限定大…...

    如何通过 Homebrew 安装 Qt 并配置环境变量

    如何通过 Homebrew 安装 Qt 并配置环境变量 Qt 是一个跨平台的应用程序开发框架&#xff0c;广泛用于开发图形界面应用。本文将详细介绍如何在 macOS 上通过 Homebrew 安装 Qt 并配置环境变量&#xff0c;以便在终端和 Qt Creator 中使用 Qt 工具。 步骤 1&#xff1a;安装 Ho…...

    RESTful 的特点与普通 Web API 的区别

    RESTful 是一种设计风格&#xff0c;而不仅仅是普通的 Web API。它遵循一些特定的原则和约束&#xff0c;使得 API 更加简洁、可扩展和易于理解。以下是 RESTful 的特点&#xff0c;以及与普通 Web API 的区别&#xff1a; RESTful 的特点 1. 资源导向 RESTful API 的核心是资…...