大数跨境
0
0

惊呆了!Spring Boot 调试执行 SQL 的12个强大技巧

惊呆了!Spring Boot 调试执行 SQL 的12个强大技巧 Spring全家桶实战案例
2025-11-02
0
导读:惊呆了!Spring Boot 调试执行 SQL 的12个强大技巧
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!
图片

🎉🎉《Spring Boot实战案例合集》目前已更新186个案例,我们将持续不断的更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

→ 现在就订阅合集

环境:SpringBoot3.4.2



1. 简介

在Spring Boot应用里调试数据库交互,就跟闭着眼在迷宫里找路一样难。用Spring Data JPA和Hibernate的时候,日志记录可不是只在控制台显示点信息那么简单,它能让我们看清应用里面到底是怎么运行的。

本文将探讨如何配置、定制和解读Hibernate与Spring Data JPA的日志记录。通过学习,你将掌握将日志转化为强大诊断与监控工具的实用技能,从而提升应用程序的可靠性和性能。

2.实战案例

2.1 开启SQL日志

spring:  jpa:    show-sqltrue

默认情况下,该配置为false。当设置 spring.jpa.show-sql=true 时,Spring Boot 会将此配置传递给底层 JPA 提供商(默认为 Hibernate),该提供商随后会将执行的所有 SQL 命令打印到标准输出(控制台)。需要注意的是,此种方式输出的SQL是通过System.out。如下示例:

Hibernate: select b1_0.id,b1_0.description,b1_0.isbn,b1_0.page,b1_0.price,b1_0.title from book b1_0 limit ?,?

它会打印出SQL语句,但不会显示绑定的参数值(占位符(?)会显示,但实际值不会)。生产环境中禁止使用show-sql功能。

2.2 格式化SQL

spring:  jpa:    properties:      hibernate:        '[format_sql]'true

该属性会对其记录的 SQL 查询进行格式化处理,使其更易于阅读。如下示例:

Hibernate:     select        b1_0.id,        b1_0.description,        b1_0.isbn,        b1_0.page,        b1_0.price,        b1_0.title     from        book b1_0     limit        ?, ?

注意:该配置必须在设置show-sql为true时有效。

2.3 高亮SQL

spring:  jpa:    properties:      hibernate:        '[highlight_sql]'true

它能在Hibernate的SQL输出中启用ANSI颜色代码,使SQL关键字、表名及其他查询部分在控制台中视觉上清晰区分。这本质上是对日志记录的SQL语句进行的"语法高亮"。如下示例:

SQL语句中的关键字高亮显示了。注意,SQL高亮功能仅在控制台或IDE日志窗口支持ANSI颜色时生效。

2.4 显示SQL注释

spring:  jpa:    properties:      hibernate:        '[use_sql_comments]'true

在生成的SQL语句中包含额外的注释行。这些注释通常标明查询的上下文或来源,例如触发该查询的实体、集合或操作。如下示例:

这里显示的是默认的注释,我们可以结合@Meta注解自定义注释说明,如下示例:

public interface BookRepository extends PagingAndSortingRepository<Book, Long>, CrudRepository<Book, Long> {  @Meta(comment = "分页查询所有的图书信息")  Page<Book> findAll(Pageable pageable) ;}

运行结果

2.5 显示统计跟踪信息

spring:  jpa:    properties:      hibernate:        '[generate_statistics]'true

它启用了Hibernate的内部统计跟踪功能。启用后,Hibernate将收集并展示有关持久层运行状况的详细运行时指标——例如查询次数、缓存命中/未命中、实体加载次数等。如下示例:

收集统计数据会增加一些开销。在开发、测试或性能分析阶段使用是可行的,但在生产环境中通常应禁用此功能,除非需要用于监控。此外,这些指标可通过JMX或Micrometer/Prometheus等工具集成到监控仪表板中。

2.6 显示慢SQL

spring:  jpa:    properties:      hibernate:        '[log_slow_query]': 200 #慢查询阈值(毫秒)logging:  level:    '[org.hibernate.SQL_SLOW]': INFO   

通过上面的配置在查询执行时间超过指定毫秒数时记录警告日志。值200表示记录所有耗时超过200毫秒的查询。如下示例:

接下来,我们将基于日志级别的SQL日志控制。

Hibernate会生成几类日志,每类日志服务于不同目的:

  • SQL查询:发送到数据库的实际SQL语句

  • 参数:查询参数的绑定值

  • 事务:事务生命周期事件

  • 缓存:一级缓存和二级缓存的命中与未命中情况

我们先将上面的所有配置删除或者关闭。

2.7 生成原始的SQL语句

logging:  level:    '[org.hibernate.SQL]'DEBUG

org.hibernate.SQL 负责输出 Hibernate 生成的原始 SQL 语句及其发送至数据库的过程,但不会显示参数值(这些需要单独的日志器)。如下示例:

21:04  DEBUG  [main] org.hibernate.SQL Line:135 -     select        b1_0.id,        b1_0.description,        b1_0.isbn,        b1_0.page,        b1_0.price,        b1_0.title     from        book b1_0     limit        ?, ?

这里输出的SQL语句完全与Hibernate发送至数据库的版本一致,但参数位置使用了占位符(?)进行标记。

2.8 显示SQL参数

logging:  level:    '[org.hibernate.SQL]'DEBUG    '[org.hibernate.orm.jdbc.bind]'TRACE

在Hibernate 6(Spring Boot 3及更高版本所采用的版本)中,此设置用于启用参数绑定日志记录功能。当设置为TRACE级别时,Hibernate会将绑定到生成的SQL语句中占位符(?)的每个值都记录到日志中。如下示例:

21:07  DEBUG  [main] org.hibernate.SQL Line:135 -     select        b1_0.id,        b1_0.description,        b1_0.isbn,        b1_0.page,        b1_0.price,        b1_0.title     from        book b1_0     limit        ?, ?21:07 TRACE  [main] org.hibernate.orm.jdbc.bind Line:24  - binding parameter (1:INTEGER<- [0]21:07 TRACE  [main] org.hibernate.orm.jdbc.bind Line:24  - binding parameter (2:INTEGER<- [20]

2.9 显示事务日志

logging:  level:    '[org.hibernate.engine.transaction]'DEBUG

此配置为Hibernate事务管理引擎启用了调试级别的日志记录。包括事务启动、提交、回滚或标记事务以供回滚等操作。如下示例:

2.10 获取数据日志(从结果集)

logging:  level:    '[org.hibernate.orm.jdbc.extract]'TRACE

这适用于Hibernate 6+的日志配置方案,可为JDBC结果提取过程生成极其详细的日志——该过程指Hibernate从数据库返回的结果集(ResultSet)中获取数据,并将其映射至Java对象(实体、DTO等)的操作。如下示例:

2.11 统计信息

spring:  jpa:    properties:      hibernate:        '[generate_statistics]'truelogging:  level:    '[org.hibernate.stat]'DEBUG

这将输出 Hibernate 统计信息日志记录。如下示例:

2.12 二级缓存&查询缓存日志

logging:  level:    '[org.hibernate.cache]'DEBUG

它控制Hibernate的二级缓存和查询缓存日志记录,显示实体/查询何时被缓存、获取或清除。在开发阶段有助于诊断缓存行为和性能,但生产环境中过于冗余。



以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

30+个 CompletableFuture 高频场景案例,让你的系统性能飙升300%

9个Spring Boot参数验证高阶技巧,第8,9个代码量直接减半!

高级开发!一个注解简化Spring Boot本地消息表(Outbox)实现

高级开发!Spring Boot 零侵入读写分离:基于SQL解析全自动路由

性能优化!Spring Boot + JPA 9 大逆天调优手段,让系统性能起飞

Spring Boot 接口敏感字段脱敏的5大"王炸"方案

5种实现方式配置Spring Boot API接口超时时间

惊了!Spring Boot 内置的7个Filter,太强了

@HttpExchange 强势登场,彻底终结 Feign 时代!

请不要自己写!Spring Boot非常实用的内置功能

SpringBoot冷门但逆天的5个神级注解,老司机都在偷偷用!

强大!借助Spring Boot内置动态刷新功能,实时更新组件

图片
图片
图片
图片
图片
图片
图片
图片
图片

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读285
粉丝0
内容832