🎉🎉《Spring Boot实战案例合集》目前已更新186个案例,我们将持续不断的更新。文末有电子书目录。
💪💪永久更新承诺
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。
💌💌如何获取
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:SpringBoot3.4.2
1. 简介
在Spring Boot应用里调试数据库交互,就跟闭着眼在迷宫里找路一样难。用Spring Data JPA和Hibernate的时候,日志记录可不是只在控制台显示点信息那么简单,它能让我们看清应用里面到底是怎么运行的。
本文将探讨如何配置、定制和解读Hibernate与Spring Data JPA的日志记录。通过学习,你将掌握将日志转化为强大诊断与监控工具的实用技能,从而提升应用程序的可靠性和性能。
2.1 开启SQL日志
spring:jpa:show-sql: true
默认情况下,该配置为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:selectb1_0.id,b1_0.description,b1_0.isbn,b1_0.page,b1_0.price,b1_0.titlefrombook b1_0limit?, ?
注意:该配置必须在设置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> {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 -selectb1_0.id,b1_0.description,b1_0.isbn,b1_0.page,b1_0.price,b1_0.titlefrombook b1_0limit?, ?
这里输出的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 -selectb1_0.id,b1_0.description,b1_0.isbn,b1_0.page,b1_0.price,b1_0.titlefrombook b1_0limit?, ?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 内置的7个Filter,太强了
@HttpExchange 强势登场,彻底终结 Feign 时代!
SpringBoot冷门但逆天的5个神级注解,老司机都在偷偷用!
强大!借助Spring Boot内置动态刷新功能,实时更新组件


