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默认采用以下连接池选择逻辑:
- 优先使用HikariCP(当检测到
spring-boot-starter-jdbc
或spring-boot-starter-data-jpa
依赖时) - 其次尝试Tomcat JDBC连接池
- 最后使用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.sql
和data.sql
初始化脚本 - 提供H2控制台访问(开发环境)
# H2控制台配置
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
多数据源配置策略
当存在多个数据库驱动时,配置优先级规则:
- 显式配置的参数具有最高优先级
- 根据
spring.datasource.*
属性动态选择 - 默认使用第一个检测到的嵌入式数据库
# 多数据源场景下的显式指定
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;
}
最佳实践建议
-
连接池配置:生产环境务必调整连接池参数
spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.connection-timeout=30000
-
事务边界:服务层应作为事务边界,而非DAO层
-
异常处理:统一使用Spring的异常体系,避免捕获特定技术异常
-
测试策略:利用嵌入式数据库进行集成测试
@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'
}
运行时自动执行:
- 解析
docker-compose.yaml
- 启动PostgreSQL容器
- 根据服务类型配置DataSource
初始化流程对比
场景 | 行为模式 | 典型应用环境 |
---|---|---|
嵌入式数据库 | 自动执行schema.sql/data.sql | 开发/测试 |
外部数据库+init模式 | 强制初始化脚本执行 | 预生产环境 |
Docker Compose | 容器启动后执行平台特定SQL脚本 | 本地开发 |
关键注意事项:
- 生产环境应禁用自动初始化(
spring.sql.init.mode=never
) - 多数据源场景需手动管理初始化顺序
- 脚本中的方言语法需与目标数据库匹配
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自动配置:
- compose文件定义:
services:postgres:image: postgres:latestenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: test-dbports:- "5432:5432"
- Gradle依赖:
dependencies {developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
}
- 自动行为:
- 应用启动时自动执行
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;}
}
性能优化要点
- 批量操作:
jdbcTemplate.batchUpdate("INSERT INTO CARD(ID, CARD_TYPE, COMMENT) VALUES (?,?,?)",new BatchPreparedStatementSetter() {// 实现批量参数设置}
);
- 连接池配置:
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
- 索引优化:
CREATE INDEX idx_card_retro_board_id ON CARD(RETRO_BOARD_ID);
Spring Boot数据访问核心架构解析
自动配置机制深度剖析
Spring Boot的数据访问自动配置建立在条件化装配基础上,通过DataSourceAutoConfiguration
和JdbcTemplateAutoConfiguration
等自动配置类实现智能装配。核心装配逻辑包括:
-
数据源检测:扫描classpath中的数据库驱动
- JDBC驱动存在时自动配置
DataSource
- 无显式配置时激活嵌入式数据库
- JDBC驱动存在时自动配置
-
连接池选择:按以下顺序尝试初始化
// 连接池选择算法 if(HikariCP可用) return new HikariDataSource(); else if(TomcatCP可用) return new TomcatDataSource(); else if(DBCP2可用) return new BasicDataSource();
-
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实现,关键配置维度包括:
-
传播行为:
@Transactional(propagation = Propagation.REQUIRES_NEW) public void processPayment() {// 始终开启新事务 }
-
隔离级别:
@Transactional(isolation = Isolation.SERIALIZABLE) public void auditOperation() {// 最高隔离级别 }
-
超时控制:
@Transactional(timeout = 30) // 30秒超时 public void batchImport() {// 批量操作 }
性能优化关键点
-
连接池调优参数:
spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.idle-timeout=30000
-
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();}} );
-
SQL日志监控:
logging.level.org.springframework.jdbc=DEBUG logging.level.org.springframework.transaction=TRACE
安全加固方案
-
密码加密存储:
@Bean public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder(); }
-
SQL注入防护:
- 始终使用参数化查询
// 错误示范 jdbcTemplate.query("SELECT * FROM users WHERE name = '"+name+"'");// 正确做法 jdbcTemplate.query("SELECT * FROM users WHERE name = ?", name);
-
连接加密:
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();}}
}
跨数据库兼容方案
-
方言抽象层:
@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();}; }
-
条件化SQL脚本:
/* schema.sql */ CREATE TABLE IF NOT EXISTS users (id ${auto_increment_type} PRIMARY KEY );
-
测试容器集成:
@Testcontainers @SpringBootTest class IntegrationTest {@Containerstatic PostgreSQLContainer postgres = new PostgreSQLContainer<>();@DynamicPropertySourcestatic void configure(DynamicPropertyRegistry registry) {registry.add("spring.datasource.url", postgres::getJdbcUrl);} }
这套架构设计使Spring Boot应用能够适应从嵌入式开发环境到分布式生产集群的各种部署场景,同时保持优异的性能表现和可维护性。开发者可根据实际需求灵活组合这些功能模块,构建符合企业标准的数据访问层。
相关文章:
Spring Boot SQL数据库功能详解
Spring Boot自动配置与数据源管理 数据源自动配置机制 当在Spring Boot项目中添加数据库驱动依赖(如org.postgresql:postgresql)后,应用启动时自动配置系统会尝试创建DataSource实现。开发者只需提供基础连接信息: 数据库URL格…...
TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析
1. 基本介绍 TPS3103K33DBVR 是 德州仪器(Texas Instruments, TI) 推出的一款 低功耗电压监控器(Supervisor IC),属于 电源管理芯片(PMIC) 类别,主要用于 系统复位和电压监测。 2. …...

C++课设:实现本地留言板系统(支持留言、搜索、标签、加密等)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、项目功能概览与亮点分析1. 核心功能…...

【见合八方平面波导外腔激光器专题系列】用于干涉光纤传感的低噪声平面波导外腔激光器2
----翻译自Mazin Alalus等人的文章 摘要 1550 nm DWDM 平面波导外腔激光器具有低相位/频率噪声、窄线宽和低 RIN 等特点。该腔体包括一个半导体增益芯片和一个带布拉格光栅的平面光波电路波导,采用 14 引脚蝶形封装。这种平面波导外腔激光器设计用于在振动和恶劣的…...

Xcode 16.2 版本 pod init 报错
Xcode 版本升级到 16.2 后,项目执行 pod init 报错; ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchron…...

timestamp时间戳转换工具
作为一名程序员,一款高效的 在线转换工具 (在线时间戳转换 计算器 字节单位转换 json格式化)必不可少!https://jsons.top 排查问题时非常痛的点: 经常在秒级、毫秒级、字符串格式的时间单位来回转换,于是决定手撸一个…...
分布式计算框架学习笔记
一、🌐 为什么需要分布式计算框架? 资源受限:单台机器 CPU/GPU 内存有限。 任务复杂:模型训练、数据处理、仿真并发等任务耗时严重。 并行优化:通过任务拆分和并行执行提升效率。 可扩展部署:适配从本地…...

数据库管理与高可用-MySQL故障排查与生产环境优化
目录 #1.1MySQL单案例故障排查 1.1.1MySQL常见的故障排查 1.1.2MySQL主从故障排查 #2.1MySQL优化 2.1.1硬件方面的优化 2.1.2进程方面的优化 #3.1MySQL存储引擎 3.1.1 MyISAM存储引擎 3.1.2 InnoDB存储引擎 1.1MySQL单案例故障排查 1.1.1MySQL常见的故障排查 (1&…...
rk3506上移植lvgl应用
本文档介绍如何在开发板上运行以及移植LVGL。 1. 移植准备 硬件环境:开发板及其配套屏幕 开发板镜像 主机环境:Ubuntu 22.04.5 2. LVGL启动 出厂系统默认配置了 LVGL,并且上电之后默认会启动 一个LVGL应用 。 LVGL 的启动脚本为/etc/init.d/pre_init/S00-lv_demo,…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析 第一轮:基础概念问题 请解释Spring框架的核心容器是什么?它的作用是什么? 程序员JY回答:Spring框架的核心容器是IoC容器(控制反转…...
Flask和Django,你怎么选?
Flask 和 Django 是 Python 两大最流行的 Web 框架,但它们的设计哲学、目标和适用场景有显著区别。以下是详细的对比: 核心区别:哲学与定位 Django: 定位: "全栈式" Web 框架。奉行"开箱即用"的理念。 哲学: "包含…...

LangChain + LangSmith + DeepSeek 入门实战:构建代码生成助手
本文基于 Jupyter Notebook 实践代码,结合 LangChain、LangSmith 和 DeepSeek 大模型,手把手演示如何构建一个代码生成助手,并实现全流程追踪与优化。 一、环境准备与配置 1. 安装依赖 pip install langchain langchain_openai2. 设置环境变…...
湖北理元理律师事务所:债务清偿方案中的法律技术革新
文/金融法律研究组 当前债务服务市场存在结构性矛盾:债权人追求快速回款,债务人需要喘息空间。湖北理元理律师事务所通过创新法律技术,在《企业破产法》《民法典》框架下构建梯度清偿模型,实现多方利益平衡。 一、个人债务优化的…...
大模型的LoRa通讯详解与实现教程
一、LoRa通讯技术概述 LoRa(Long Range)是一种低功耗广域网(LPWAN)通信技术,由Semtech公司开发,特别适合于物联网设备的长距离、低功耗通信需求。LoRa技术基于扩频调制技术,能够在保持低功耗的同时实现数公里甚至数十公里的通信距离。 LoRa的主要特点 长距离通信:在城…...

【Elasticsearch基础】Elasticsearch批量操作(Bulk API)深度解析与实践指南
目录 1 Bulk API概述 1.1 什么是批量操作 1.2 Bulk API的优势 2 Bulk API的工作原理 2.1 请求处理流程 2.2 底层机制 3 Bulk API的使用方法 3.1 基本请求格式 3.2 操作类型示例 3.3 响应格式 4 Bulk API的最佳实践 4.1 批量大小优化 4.2 错误处理策略 4.3 性能调…...
PCA笔记
✅ 问题本质:为什么让矩阵 TT 的行列式为 1? 这个问题通常出现在我们对数据做**线性变换(旋转/缩放)**的时候,比如在 PCA 中把数据从原始坐标系变换到主成分方向时。 📌 回顾一下背景 在 PCA 中ÿ…...

MySQL 数据库深度剖析:事务、SQL 优化、索引与 Buffer Pool
在当今数据驱动的时代,数据库作为数据存储与管理的核心,其性能与可靠性至关重要。MySQL 作为一款广泛使用的开源数据库,在众多应用场景中发挥着关键作用。在这篇博客中,我将围绕 MySQL 数据库的核心知识展开,涵盖事务及…...

MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程
文章目录 前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在数字世界高速发展的今天,您是否察觉到那些静默增长的视觉数据正在悄然蚕食存储空间?随着影像记录成为日常习惯&…...
迁移科技3D视觉系统:重塑纸箱拆垛场景的智能革命
一、传统拆垛场景的困局与破局之道 在汽车零部件仓库中,每天有超过2万只异形纸箱需要拆垛分拣。传统人工拆垛面临三大挑战: 效率瓶颈:工人每小时仅能处理200-300件,且存在间歇性疲劳安全隐患:20kg以上重箱搬运导致年…...

World-writable config file /etc/mysql/mysql.conf.d/my.cnf is ignored
https://stackoverflow.com/questions/53741107/mysql-in-docker-on-ubuntu-warning-world-writable-config-file-is-ignored 修改权限 -> 重启mysql # 检查字符集配置 SHOW VARIABLES WHERE Variable_name IN (character_set_server, character_set_database ); --------…...
JS的传统写法 vs 简写形式
一、条件判断与逻辑操作 三元运算符简化条件判断 // 传统写法 let result; if (someCondition) {result yes; } else {result no; }// 简写方式 const result someCondition ? yes : no;短路求值 // 传统写法 if (condition) {doSomething(); }// 简写方式 condition &…...

信息收集:从图像元数据(隐藏信息收集)到用户身份的揭秘 --- 7000
目录 🌐 访问Web服务 💻 分析源代码 ⬇️ 下载图片并保留元数据 🔍 提取元数据(重点) 👤 生成用户名列表 🛠️ 技术原理 图片元数据(EXIF 数据) Username-Anarch…...
OCC笔记:TDF_Label中有多个相同类型属性
注:OCCT版本:7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...

如何优雅地绕过限制调用海外AI-API?反向代理与API中转技术详解
阅读时长 | 8分钟 适用读者 | 需要跨境调用OpenAI等AI服务的开发者/企业 一、问题背景:为什么需要代理? 最近在技术社区看到这样的求助: "公司服务器在国内,但业务需要调用OpenAI接口,直接访…...

【自然语言处理】大模型时代的数据标注(主动学习)
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计E 个人总结 A 论文出处 论文题目:FreeAL: Towards Human-Free Active Learning in the Era of Large Language Models发表情况:2023-EMNLP作者单位:浙江大…...

React与原生事件:核心差异与性能对比解析
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
Go 并发编程基础:select 多路复用
select 是 Go 并发编程中非常强大的语法结构,它允许程序同时等待多个通道操作的完成,从而实现多路复用机制,是协程调度、超时控制、通道竞争等场景的核心工具。 一、什么是 select select 类似于 switch 语句,但它用于监听多个通…...

暴雨新专利解决服务器噪音与性能悖论
6月1日,我国首部数据中心绿色化评价方面国家标准《绿色数据中心评价》正式实施,为我国数据中心的绿色低碳建设提供了明确指引。《评价》首次将噪音控制纳入国家级绿色评价体系,要求从设计隔声结构到运维定期监测实现闭环管控,加速…...

Go 语言中的内置运算符
1. 算术运算符 注意: (自增)和--(自减)在 Go 语言中是单独的语句,并不是运算符。 package mainimport "fmt"func main() {fmt.Println("103", 103) // 13fmt.Println("10-3…...
Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南
Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南 在金融行业安全审计中,未启用HTTPS的Web应用被列为高危漏洞。通过正确配置HTTPS,可将中间人攻击风险降低98%——本文将全面解析Spring Boot中HTTPS的实现方案与实战避坑指南。 一、HTTPS 核心原理与…...