Spring Boot SQL数据库功能详解

Spring Boot自动配置与数据源管理

数据源自动配置机制

当在Spring Boot项目中添加数据库驱动依赖(如org.postgresql:postgresql)后,应用启动时自动配置系统会尝试创建DataSource实现。开发者只需提供基础连接信息:

  • 数据库URL格式:jdbc:<引擎>://<服务器>:<端口>/<数据库>[/|?<附加参数>]
  • 数据库用户名和密码
  • 数据库驱动类名(可选)
// 典型配置示例(application.properties)
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=admin
spring.datasource.password=secret

若未显式配置这些参数,Spring Boot会根据classpath中的驱动自动配置嵌入式数据库(如H2)。

连接池管理策略

Spring Boot默认采用以下连接池选择逻辑:

  1. 优先使用HikariCP(当检测到spring-boot-starter-jdbcspring-boot-starter-data-jpa依赖时)
  2. 其次尝试Tomcat JDBC连接池
  3. 最后使用Commons DBCP2

开发者可通过配置切换连接池实现:

# 使用Tomcat连接池
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

应用服务器集成

在Tomcat、WebSphere等应用服务器部署时,可通过JNDI获取数据源:

# JNDI配置示例
spring.datasource.jndi-name=java:comp/env/jdbc/MyDataSource

嵌入式数据库支持

当未显式配置数据源时,Spring Boot自动激活嵌入式数据库支持:

  • 自动检测H2、HSQL、Derby等嵌入式数据库
  • 默认执行schema.sqldata.sql初始化脚本
  • 提供H2控制台访问(开发环境)
# H2控制台配置
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

多数据源配置策略

当存在多个数据库驱动时,配置优先级规则:

  1. 显式配置的参数具有最高优先级
  2. 根据spring.datasource.*属性动态选择
  3. 默认使用第一个检测到的嵌入式数据库
# 多数据源场景下的显式指定
spring.datasource.driver-class-name=org.postgresql.Driver

Docker Compose集成

Spring Boot 3.1+新增对Docker Compose的原生支持:

  • 自动读取docker-compose.yaml文件
  • 根据服务类型配置对应数据源
  • 仅开发环境生效(developmentOnly作用域)
// build.gradle配置
dependencies {developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
}

这种机制显著简化了开发环境的数据库配置流程,实现基础设施即代码的实践。

Spring框架数据访问核心功能

事务管理抽象层

Spring提供完整的事务管理抽象,支持以下关键特性:

  • 统一编程模型:跨JTA、JDBC、Hibernate和JPA等不同API保持一致的编程方式
  • 声明式事务:通过@Transactional注解实现基于AOP的事务控制
  • 隔离级别配置:支持READ_UNCOMMITTED到SERIALIZABLE各级别配置
  • 与数据访问层深度集成:完美配合Spring的DAO抽象层
// 声明式事务示例
@Transactional(isolation = Isolation.READ_COMMITTED)
public void transferMoney(Account from, Account to, BigDecimal amount) {accountRepository.debit(from, amount);accountRepository.credit(to, amount);
}

DAO支持机制

Spring的DAO抽象提供以下核心价值:

  • 技术无关的访问方式:统一JDBC、Hibernate和JPA的操作接口
  • 异常转换系统:将技术特定异常(如SQLException)转换为Spring的DataAccessException体系
  • @Repository注解:标记DAO组件并启用异常转换
@Repository
public class UserRepository implements SimpleRepository {private final JdbcTemplate jdbcTemplate;@Override@Transactionalpublic User save(User user) {// 数据库操作代码}
}

JDBC增强支持

Spring JDBC显著简化传统JDBC操作:

JdbcTemplate核心功能
  • 自动处理连接生命周期
  • 异常处理和类型转换
  • 批处理操作支持
  • 命名参数支持(NamedParameterJdbcTemplate)
public class ProductRepository {private final JdbcTemplate jdbc;public List findByCategory(String category) {return jdbc.query("SELECT * FROM products WHERE category = ?",new BeanPropertyRowMapper<>(Product.class),category);}
}
嵌入式数据库支持

自动初始化H2、HSQL等嵌入式数据库:

# 初始化配置
spring.sql.init.mode=always
spring.sql.init.platform=h2
spring.datasource.generate-unique-name=false

配套SQL脚本示例(schema.sql):

CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,price DECIMAL(10,2) CHECK (price > 0)
);

R2DBC响应式支持

对于响应式编程场景,Spring提供R2DBC集成:

@Repository
public class ReactiveUserRepository {private final DatabaseClient databaseClient;public Flux findAll() {return databaseClient.sql("SELECT * FROM users").map(row -> new User(row.get("id", Integer.class),row.get("name", String.class))).all();}
}

关键组件包括:

  • DatabaseClient:响应式操作入口
  • ConnectionFactory:连接工厂抽象
  • 响应式事务管理

ORM集成支持

Spring对主流ORM框架提供深度集成:

JPA/Hibernate支持
@Entity
public class Employee {@Id @GeneratedValueprivate Long id;private String name;@ManyToOneprivate Department department;
}@Repository
public interface EmployeeRepository extends JpaRepository {List findByDepartmentName(String deptName);
}
对象-XML映射

支持JAXB和Spring OXM进行对象与XML转换:

@Bean
Marshaller jaxbMarshaller() {Jaxb2Marshaller marshaller = new Jaxb2Marshaller();marshaller.setPackagesToScan("com.example.model");return marshaller;
}

最佳实践建议

  1. 连接池配置:生产环境务必调整连接池参数

    spring.datasource.hikari.maximum-pool-size=20
    spring.datasource.hikari.connection-timeout=30000
    
  2. 事务边界:服务层应作为事务边界,而非DAO层

  3. 异常处理:统一使用Spring的异常体系,避免捕获特定技术异常

  4. 测试策略:利用嵌入式数据库进行集成测试

    @DataJdbcTest
    class UserRepositoryTests {@Autowiredprivate UserRepository repository;@Testvoid shouldSaveUser() {User saved = repository.save(new User("test"));assertThat(saved.getId()).isNotNull();}
    }
    

这套数据访问抽象使开发者能够基于统一的编程模型构建企业级应用,同时保持对各底层技术的完整控制力。Spring Boot在此基础上通过自动配置和默认设置进一步简化了开发流程。

用户应用JDBC实战

项目结构改造

build.gradle中添加关键依赖:

dependencies {implementation 'org.springframework.boot:spring-boot-starter-jdbc'runtimeOnly 'com.h2database:h2'runtimeOnly 'org.postgresql:postgresql'
}

这种配置允许应用在开发时使用H2内存数据库,生产环境切换至PostgreSQL。Spring Boot会根据classpath中的驱动自动选择数据源实现。

记录类型应用

采用Java 14的Record特性定义不可变用户模型:

@Builder
public record User(Integer id,String email,String name,String password,boolean active,String gravatarUrl,@Singular("role") List userRole
) {// 紧凑构造函数包含验证逻辑public User {Objects.requireNonNull(email);Pattern.compile("^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$").matcher(email).matches();// 密码强度验证...}
}

相比Lombok的@Data注解,Record类型提供:

  • 自动生成的equals()/hashCode()/toString()
  • 不可变特性保证线程安全
  • 紧凑构造函数实现验证逻辑

行映射实现

通过RowMapper接口实现结果集到对象的转换:

public class UserRowMapper implements RowMapper {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {Array array = rs.getArray("user_role");String[] roles = (String[])array.getArray();return User.builder().id(rs.getInt("id")).email(rs.getString("email")).name(rs.getString("name")).password(rs.getString("password")).userRole(Arrays.stream(roles).map(UserRole::valueOf).collect(Collectors.toList())).build();}
}

该实现处理了PostgreSQL数组类型到Java集合的转换。

JdbcTemplate操作

仓库类中封装核心CRUD操作:

@Repository
public class UserRepository implements SimpleRepository {private final JdbcTemplate jdbcTemplate;public User save(User user) {KeyHolder keyHolder = new GeneratedKeyHolder();jdbcTemplate.update(conn -> {PreparedStatement ps = conn.prepareStatement("INSERT INTO users (...) VALUES (...)",Statement.RETURN_GENERATED_KEYS);// 参数绑定...return ps;}, keyHolder);return user.withId(keyHolder.getKey().intValue());}public Optional findById(Integer id) {return Optional.ofNullable(jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?",new UserRowMapper(),id));}
}

关键操作模式:

  • update():执行DML语句并处理生成键
  • queryForObject():精确查询单条记录
  • query():处理结果集的多行映射

数据库初始化

通过schema.sql定义表结构:

CREATE TABLE USERS(ID           SERIAL PRIMARY KEY,EMAIL        VARCHAR(255) UNIQUE NOT NULL,USER_ROLE    VARCHAR(5)[] NOT NULL DEFAULT ARRAY['INFO']
);

Spring Boot自动执行该脚本,支持多数据库方言版本:

  • schema-h2.sql:H2专用语法
  • schema-postgresql.sql:PostgreSQL专用语法

测试验证

集成测试验证持久层功能:

@SpringBootTest
class UserRepositoryTest {@Autowired UserRepository repository;@Testvoid shouldSaveAndRetrieveUser() {User saved = repository.save(testUser);assertThat(repository.findById(saved.id())).isPresent().get().extracting(User::email).isEqualTo("test@example.com");}
}

测试时自动使用H2内存数据库,无需外部依赖。

数据库初始化与测试策略

SQL脚本自动执行机制

Spring Boot通过特定命名的SQL文件实现数据库结构初始化,需遵循以下规则:

  • schema.sql:包含DDL语句(CREATE/DROP等)
  • data.sql:包含DML语句(INSERT/UPDATE等)
  • 多数据库支持:schema-{platform}.sql(如schema-h2.sql
/* schema-postgresql.sql示例 */
CREATE TABLE USERS(ID           SERIAL PRIMARY KEY,EMAIL        VARCHAR(255) UNIQUE NOT NULL,USER_ROLE    VARCHAR[] NOT NULL
);

初始化行为通过以下属性控制:

# 强制初始化(生产环境慎用)
spring.sql.init.mode=always
# 指定数据库平台
spring.sql.init.platform=postgresql

多环境数据库适配

针对不同数据库引擎的差异化处理:

H2内存数据库配置
# 启用H2控制台
spring.h2.console.enabled=true
# 固定数据库名称
spring.datasource.name=test-db
spring.datasource.generate-unique-name=false
PostgreSQL生产配置
# 连接参数
spring.datasource.url=jdbc:postgresql://localhost:5432/test-db
spring.datasource.username=postgres
spring.datasource.password=postgres
# 驱动显式指定
spring.datasource.driver-class-name=org.postgresql.Driver

测试环境策略

单元测试采用H2内存数据库实现自动化测试:

测试类示例
@SpringBootTest
class UsersHttpRequestTests {@Autowired TestRestTemplate restTemplate;@Testvoid shouldReturnUserCollection() {Collection users = restTemplate.getForObject("/users", Collection.class);assertThat(users).hasSizeGreaterThan(1);}
}
测试配置特点
  • 自动检测classpath中的H2驱动
  • 无需显式配置连接参数
  • 每次测试独立数据库实例

Docker Compose集成

Spring Boot 3.1+提供开发时自动启动数据库服务的能力:

compose文件定义
services:postgres:image: postgresenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: test-dbports:- 5432:5432
依赖配置
dependencies {developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
}

运行时自动执行:

  1. 解析docker-compose.yaml
  2. 启动PostgreSQL容器
  3. 根据服务类型配置DataSource

初始化流程对比

场景行为模式典型应用环境
嵌入式数据库自动执行schema.sql/data.sql开发/测试
外部数据库+init模式强制初始化脚本执行预生产环境
Docker Compose容器启动后执行平台特定SQL脚本本地开发

关键注意事项:

  1. 生产环境应禁用自动初始化(spring.sql.init.mode=never
  2. 多数据源场景需手动管理初始化顺序
  3. 脚本中的方言语法需与目标数据库匹配

MyRetro看板应用进阶

复杂关系映射实现

在MyRetro应用中,RetroBoard与Card形成一对多关系,通过JDBC实现时需要特殊处理:

// RetroBoard实体类定义
@Builder
@Data
public class RetroBoard {private UUID id;private String name;private Map cards = new HashMap<>();
}// 数据库表结构SQL
CREATE TABLE RETRO_BOARD(ID UUID PRIMARY KEY,NAME VARCHAR(255)
);
CREATE TABLE CARD(ID UUID PRIMARY KEY,CARD_TYPE VARCHAR(5),COMMENT VARCHAR(255),RETRO_BOARD_ID UUID REFERENCES RETRO_BOARD(ID)
);

UUID主键策略

PostgreSQL通过uuid-ossp扩展实现UUID生成:

-- 启用UUID扩展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";-- DDL中使用UUID生成
CREATE TABLE RETRO_BOARD(ID UUID DEFAULT uuid_generate_v4() PRIMARY KEY
);

Java层与数据库的UUID转换处理:

// RowMapper中的UUID处理
public RetroBoard mapRow(ResultSet rs, int rowNum) throws SQLException {RetroBoard board = new RetroBoard();board.setId(UUID.fromString(rs.getString("id")));// 其他字段处理...
}

事务管理实践

多表操作通过@Transactional保证原子性:

@Repository
public class RetroBoardRepository {@Transactionalpublic RetroBoard save(RetroBoard board) {// 保存主表jdbcTemplate.update("INSERT INTO RETRO_BOARD..."); // 保存关联卡片board.getCards().values().forEach(card -> {jdbcTemplate.update("INSERT INTO CARD...");});return board;}@Transactionalpublic void deleteById(UUID id) {// 先删除子表记录jdbcTemplate.update("DELETE FROM CARD...");// 再删除主表记录jdbcTemplate.update("DELETE FROM RETRO_BOARD...");}
}

Docker Compose开发集成

Spring Boot 3.1+的Docker Compose自动配置:

  1. compose文件定义
services:postgres:image: postgres:latestenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: test-dbports:- "5432:5432"
  1. Gradle依赖
dependencies {developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
}
  1. 自动行为
  • 应用启动时自动执行docker compose up
  • 根据服务类型配置DataSource
  • 开发结束后自动清理容器(默认行为)

复杂查询处理

关联查询结果的行映射技巧:

public class RetroBoardRowMapper implements RowMapper {@Overridepublic RetroBoard mapRow(ResultSet rs, int rowNum) throws SQLException {RetroBoard board = new RetroBoard();board.setId(UUID.fromString(rs.getString("id")));Map cards = new HashMap<>();do {Card card = new Card();card.setId(UUID.fromString(rs.getString("card_id")));// 其他字段填充...cards.put(card.getId(), card);} while (rs.next() && board.getId().equals(UUID.fromString(rs.getString("id"))));board.setCards(cards);return board;}
}

性能优化要点

  1. 批量操作
jdbcTemplate.batchUpdate("INSERT INTO CARD(ID, CARD_TYPE, COMMENT) VALUES (?,?,?)",new BatchPreparedStatementSetter() {// 实现批量参数设置}
);
  1. 连接池配置
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
  1. 索引优化
CREATE INDEX idx_card_retro_board_id ON CARD(RETRO_BOARD_ID);

Spring Boot数据访问核心架构解析

自动配置机制深度剖析

Spring Boot的数据访问自动配置建立在条件化装配基础上,通过DataSourceAutoConfigurationJdbcTemplateAutoConfiguration等自动配置类实现智能装配。核心装配逻辑包括:

  1. 数据源检测:扫描classpath中的数据库驱动

    • JDBC驱动存在时自动配置DataSource
    • 无显式配置时激活嵌入式数据库
  2. 连接池选择:按以下顺序尝试初始化

    // 连接池选择算法
    if(HikariCP可用) return new HikariDataSource();
    else if(TomcatCP可用) return new TomcatDataSource();
    else if(DBCP2可用) return new BasicDataSource();
    
  3. JNDI回退:当检测到应用服务器环境时

    spring.datasource.jndi-name=java:comp/env/jdbc/MyDS
    

多数据源处理策略

企业级应用常需访问多个数据源,Spring Boot通过抽象提供优雅解决方案:

@Configuration
public class MultiDataSourceConfig {@Bean@Primary@ConfigurationProperties("app.datasource.primary")public DataSource primaryDataSource() {return DataSourceBuilder.create().build();}@Bean@ConfigurationProperties("app.datasource.secondary")public DataSource secondaryDataSource() {return DataSourceBuilder.create().build();}
}

配套属性配置:

# 主数据源
app.datasource.primary.url=jdbc:mysql://localhost:3306/primary
app.datasource.primary.username=admin# 次要数据源
app.datasource.secondary.url=jdbc:postgresql://localhost:5432/secondary
app.datasource.secondary.driver-class-name=org.postgresql.Driver

事务管理最佳实践

Spring的声明式事务管理通过AOP实现,关键配置维度包括:

  1. 传播行为

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void processPayment() {// 始终开启新事务
    }
    
  2. 隔离级别

    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void auditOperation() {// 最高隔离级别
    }
    
  3. 超时控制

    @Transactional(timeout = 30) // 30秒超时
    public void batchImport() {// 批量操作
    }
    

性能优化关键点

  1. 连接池调优参数

    spring.datasource.hikari.maximum-pool-size=20
    spring.datasource.hikari.minimum-idle=5
    spring.datasource.hikari.idle-timeout=30000
    
  2. JdbcTemplate批量操作

    jdbcTemplate.batchUpdate("INSERT INTO users (name) VALUES (?)",new BatchPreparedStatementSetter() {public void setValues(PreparedStatement ps, int i) {ps.setString(1, names.get(i));}public int getBatchSize() {return names.size();}}
    );
    
  3. SQL日志监控

    logging.level.org.springframework.jdbc=DEBUG
    logging.level.org.springframework.transaction=TRACE
    

安全加固方案

  1. 密码加密存储

    @Bean
    public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();
    }
    
  2. SQL注入防护

    • 始终使用参数化查询
    // 错误示范
    jdbcTemplate.query("SELECT * FROM users WHERE name = '"+name+"'");// 正确做法
    jdbcTemplate.query("SELECT * FROM users WHERE name = ?", name);
    
  3. 连接加密

    spring.datasource.url=jdbc:postgresql://localhost/test?ssl=true
    spring.datasource.hikari.data-source-properties.sslMode=REQUIRE
    

监控与健康检查

Spring Actuator提供数据源健康指标:

management.endpoint.health.show-details=always

自定义健康检查:

@Component
public class DatabaseHealthIndicator implements HealthIndicator {private final JdbcTemplate jdbcTemplate;public Health health() {try {jdbcTemplate.queryForObject("SELECT 1", Integer.class);return Health.up().build();} catch(Exception e) {return Health.down().withDetail("error", e.getMessage()).build();}}
}

跨数据库兼容方案

  1. 方言抽象层

    @Bean
    public Dialect databaseDialect(DataSource dataSource) {String productName = dataSource.getConnection().getMetaData().getDatabaseProductName();return switch(productName) {case "PostgreSQL" -> new PostgreSQLDialect();case "MySQL" -> new MySQLDialect();default -> new StandardDialect();};
    }
    
  2. 条件化SQL脚本

    /* schema.sql */
    CREATE TABLE IF NOT EXISTS users (id ${auto_increment_type} PRIMARY KEY
    );
    
  3. 测试容器集成

    @Testcontainers
    @SpringBootTest
    class IntegrationTest {@Containerstatic PostgreSQLContainer postgres = new PostgreSQLContainer<>();@DynamicPropertySourcestatic void configure(DynamicPropertyRegistry registry) {registry.add("spring.datasource.url", postgres::getJdbcUrl);}
    }
    

这套架构设计使Spring Boot应用能够适应从嵌入式开发环境到分布式生产集群的各种部署场景,同时保持优异的性能表现和可维护性。开发者可根据实际需求灵活组合这些功能模块,构建符合企业标准的数据访问层。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java每日精进 6.11【消息队列】

1.内存级Spring_Event 1.1 控制器层&#xff1a;StringTextController /*** 字符串文本管理控制器* 提供通过消息队列异步获取文本信息的接口*/ RestController RequestMapping("/api/string-text") public class StringTextController {Resourceprivate StringTex…

【凌智视觉模块】rv1106 部署 ppocrv4 检测模型 rknn 推理

PP-OCRv4 文本框检测 1. 模型介绍 如有需要可以前往我们的仓库进行查看 凌智视觉模块 PP-OCRv4在PP-OCRv3的基础上进一步升级。整体的框架图保持了与PP-OCRv3相同的pipeline&#xff0c;针对检测模型和识别模型进行了数据、网络结构、训练策略等多个模块的优化。 从算法改…

uniapp Vue2 获取电量的独家方法:绕过官方插件限制

在使用 uniapp 进行跨平台应用开发时&#xff0c;获取设备电量信息是一个常见的需求。然而&#xff0c;uniapp 官方提供的uni.getBatteryInfo方法存在一定的局限性&#xff0c;它不仅需要下载插件&#xff0c;而且目前仅支持 Vue3&#xff0c;这让使用 Vue2 进行开发的开发者陷…

Go语言中的if else控制语句

if else是Go语言中最基础也最常用的条件控制语句&#xff0c;用于根据条件执行不同的代码块。下面我将详细介绍Go语言中if else的各种用法和特性。 1. 基本语法 1.1. 最简单的if语句 if 条件表达式 {// 条件为true时执行的代码 } 示例&#xff1a; if x > 10 {fmt.Prin…

[Spring]-AOP

AOP场景 AOP: Aspect Oriented Programming (面向切面编程) OOP: Object Oriented Programming (面向对象编程) 场景设计 设计: 编写一个计算器接口和实现类&#xff0c;提供加减乘除四则运算 需求: 在加减乘除运算的时候需要记录操作日志(运算前参数、运算后结果)实现方案:…

Web3 借贷与清算机制全解析:链上金融的运行逻辑

Web3 借贷与清算机制全解析&#xff1a;链上金融的运行逻辑 超额抵押借款 例如&#xff0c;借款人用ETH为抵押借入DAI&#xff1b;借款人的ETH的价值一定是要超过DAI的价值&#xff1b;借款人可以任意自由的使用自己借出的DAI 稳定币 第一步&#xff1a;借款人需要去提供一定…

RK3588开发笔记-GNSS-RTK模块调试

目录 前言 一、什么是GNSS/RTK 二、硬件连接 三、内核配置 四、模块调试 五、ntripclient使用 总结 前言 在RK3588平台上集成高精度定位功能是许多工业级应用的需求。本文记录了我调试GNSS-RTK模块的全过程,包含硬件连接、驱动移植、数据解析和精度优化等关键环节,希望对…

Vue.js $emit的介绍和简单使用

前言 在 Vue.js 开发中&#xff0c;组件化是核心思想之一。但组件间的通信是一个重要课题&#xff0c;特别是子组件向父组件传递数据的场景。Vue 提供了多种通信方式&#xff0c;而$emit正是实现子→父通信的关键方法。本文将深入解析$emit的原理、使用场景及最佳实践。 一、$e…

【Linux 学习计划】-- 简易版shell编写

目录 思路 创建自己的命令行 获取用户命令 分割命令 检查是否是内建命令 cd命令实现 进程程序替换执行程序 总代码 结语 思路 int main() {while (1){// 1. 自己的命令行PrintCommandLine();// 2. 获取用户命令char command[SIZE];int n GetUserCommand(command, si…

一个完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (二)

&#x1f4c4; 本地 Windows 部署 Logstash 连接本地 Elasticsearch 指南 ✅ 目标 在本地 Windows 上安装并运行 Logstash配置 Logstash 将数据发送至本地 Elasticsearch测试数据采集与 ES 存储流程 &#x1f9f0; 前提条件 软件版本要求安装说明Java17Oracle JDK 下载 或 O…

Java使用Selenium反爬虫优化方案

当我们爬取大站的时候&#xff0c;就得需要对抗反爬虫机制的场景&#xff0c;因为项目要求使用Java和Selenium。Selenium通常用于模拟用户操作&#xff0c;但效率较低&#xff0c;所以需要我们结合其他技术来实现高效。 在 Java 中使用 Selenium 进行高效反爬虫对抗时&#xff…

状态管理方案对比与决策

1. 状态管理的基本概念 现代前端应用随着功能复杂度提升&#xff0c;状态管理已成为架构设计的核心挑战。状态管理本质上解决的是数据的存储、变更追踪和响应式更新问题&#xff0c;以确保UI与底层数据保持同步。 核心挑战: 状态共享与组件通信可预测的状态变更性能优化与重…

Fetch与Axios:区别、联系、优缺点及使用差异

Fetch与Axios&#xff1a;区别、联系、优缺点及使用差异 文章目录 Fetch与Axios&#xff1a;区别、联系、优缺点及使用差异一、联系二、区别1. 浏览器支持与兼容性2. 响应处理3. 请求拦截和响应拦截4. 错误处理 三、优缺点1. Fetch API优点缺点 2. Axios优点缺点 四、使用上的差…

【Docker】快速入门与项目部署实战

我们在部署一个项目时&#xff0c;会出现一系列问题比如&#xff1a; 命令太多了&#xff0c;记不住软件安装包名字复杂&#xff0c;不知道去哪里找安装和部署步骤复杂&#xff0c;容易出错 其实上述问题不仅仅是新手&#xff0c;即便是运维在安装、部署的时候一样会觉得麻烦…

Java面试题尚硅谷版第1季

1、写出如下代码运行结果 1.1、 使用局部变量表和操作数栈解题 1.2、使用前置和后置递增解题 2、写一个单例模式 2.1、考察知识点 2.2、单例模式实现 3、类加载和初始化顺序 package classload;public class Father {private int i test();private static int j method();st…

关于Qt阻断样式继承的解决办法

引言 在使用 Qt 开发桌面应用时&#xff0c;借助样式表&#xff08;StyleSheet&#xff09;来统一定义界面风格是非常常见的做法。通常&#xff0c;你会在主程序中通过 qApp->setStyleSheet(...) 或者直接给某个父控件设置样式表&#xff0c;让所有的子控件都采用相同的配色…

鼠标右键添加新建某种文件的方法

场景 我经常用到.emmx&#xff0c;.eddx文件&#xff0c;电脑上装的是wpsX亿图&#xff08;因为有wps会员&#xff09;&#xff0c;没有开亿图会员。 然后问题就是&#xff0c;思维导图和流程图我都能正常开&#xff0c;正常编辑&#xff0c;但鼠标右键没有新建这两个文件的按…

Inxpect安全雷达传感器与控制器:动态检测 + 抗干扰技术重构工业安全防护体系

Inxpect 推出工业安全领域新型智能传感器与控制器&#xff0c;其核心产品为雷达扫描仪&#xff0c;具备动态调整检测区域、抗干扰能力强等特点&#xff0c;可精准检测危险区域人员进入或存在情况&#xff0c;适用于移动机器人等场景。 Inxpect安全雷达传感器核心功能 动态检测…

【AI学习】李广密与阶跃星辰首席科学家张祥雨对谈:多模态发展的历史和未来

仔细阅读了文章《专访张祥雨&#xff1a;多模态推理和自主学习是未来的 2 个 「GPT-4」 时刻》 https://mp.weixin.qq.com/s/892QuRPH9uP6zN6dS-HZMw 非常赞叹的一篇文章&#xff0c;说清楚了NLP、CV发展中的许多重大问题&#xff0c;读来醍醐灌顶&#xff01;这样的文章&…

C++中std::deque详解和实战工程代码示例

C中std::deque详解和实战工程代码示例 std::deque&#xff08;双端队列&#xff09;是 C 标准库中的一个序列容器&#xff0c;与 std::vector 类似&#xff0c;但它支持从头部和尾部高效地插入和删除元素。它底层采用分段连续空间实现&#xff0c;兼具灵活性与性能。 一、基本…