驚呆了!Spring Boot 調試執行 SQL 的12個強大技巧
環境:SpringBoot3.4.2
1. 簡介
在Spring Boot應用里調試數據庫交互,就跟閉著眼在迷宮里找路一樣難。用Spring Data JPA和Hibernate的時候,日志記錄可不是只在控制臺顯示點信息那么簡單,它能讓我們看清應用里面到底是怎么運行的。
本文將探討如何配置、定制和解讀Hibernate與Spring Data JPA的日志記錄。通過學習,你將掌握將日志轉化為強大診斷與監控工具的實用技能,從而提升應用程序的可靠性和性能。
2.實戰案例
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:
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]': DEBUGorg.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]': true
logging:
level:
'[org.hibernate.stat]': DEBUG這將輸出 Hibernate 統計信息日志記錄。如下示例:
圖片
2.12 二級緩存&查詢緩存日志
logging:
level:
'[org.hibernate.cache]': DEBUG它控制Hibernate的二級緩存和查詢緩存日志記錄,顯示實體/查詢何時被緩存、獲取或清除。在開發階段有助于診斷緩存行為和性能,但生產環境中過于冗余。
























