介紹一下P6spy驅動
p6spy 是一款開源的數據庫監控框架,主要用于 攔截和記錄應用程序與數據庫之間的所有交互(如 SQL 語句、參數、執行時間等)
它通過包裝現有的 JDBC 驅動(如 MySQL JDBC 驅動),在不修改業務代碼的情況下,實現對數據庫操作的透明監控和分析。
p6spy 和普通 MySQL 驅動的區別
特性 | 普通 MySQL 驅動(如 ) | p6spy |
核心功能 | 實現數據庫通信協議,執行 SQL 并返回結果。 | 攔截和增強現有 JDBC 驅動的功能,記錄 SQL 操作。 |
日志能力 | 僅支持基礎日志(需手動配置,功能有限)。 | 提供詳細的 SQL 日志(含參數、執行時間、調用棧)。 |
代碼侵入性 | 無侵入,直接使用原生驅動。 | 無侵入,通過配置替換原生驅動為 p6spy 驅動。 |
性能開銷 | 低,僅處理數據庫通信。 | 有一定開銷(額外攔截和日志記錄)。 |
適用場景 | 生產環境直接操作數據庫。 | 開發/測試環境調試、性能優化、審計。 |
p6spy 的核心價值
透明監控
無需修改代碼,通過配置即可捕獲所有 SQL 操作
記錄完整的 SQL 語句(含動態參數)、執行時間、連接信息等
調試與優化
快速定位慢查詢(通過執行時間分析)。
驗證 SQL 參數是否正確綁定(避免 SQL 注入或邏輯錯誤)
日志增強
支持格式化輸出(如 JSON、SQL 美化)
可集成日志框架(如 Log4j、SLF4J)
P6spy使用快速入門
依賴
<dependency><groupId>com.github.klboke</groupId><artifactId>p6spy-spring-boot-starter</artifactId><version>1.0</version>
</dependency>
配置文件
application.yml
指定依賴:com.p6spy.engine.spy.P6SpyDriver
spring:application:name: Kira-Test # 注意:YAML中使用冒號(:)而非等號(=)datasource:driver-class-name: com.p6spy.engine.spy.P6SpyDriverurl: jdbc:p6spy:mysql://127.0.0.1/mytestusername: rootpassword: 123456hikari:minimum-idle: 5 # 最小空閑連接數maximum-pool-size: 20 # 最大連接數idle-timeout: 60000 # 空閑連接超時時間(ms)max-lifetime: 1800000 # 連接最大存活時間(ms)connection-timeout: 20000 # 連接超時時間(ms)validation-timeout: 5000 # 驗證查詢超時時間(ms)leak-detection-threshold: 2000 # 連接泄漏檢測閾值(ms)logging:level:com.p6spy: DEBUGp6spy: DEBUG
spy.properties
p6spy的配置文件
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory#logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime)| SQL耗時:%(executionTime) ms | 連接%(connectionId) | 執行的SQL語句:%(category) %(sql)appender=com.p6spy.engine.spy.appender.StdoutLoggerexcludecategories=info,debug,result,batc,resultsetderegisterdrivers=truedateformat=yyyy-MM-dd HH:mm:ssdriverlist=com.p6spy.engine.spy.P6SpyDriveroutagedetection=trueoutagedetectioninterval=2
控制臺輸出的sql細節
2025-04-11 11:23:44| SQL耗時:6 ms | 連接0 | 執行的SQL語句:statement insert into t_pha_trade (json_test) VALUES ('[{"installAdsNum":3,"retentionDuration":"30","retentionStrategy":"0.6,0.52,0.5"},{"installAdsNum":5,"retentionDuration":"45","retentionStrategy":"0.7,0.6,0.55,0.5"},{"installAdsNum":2,"retentionDuration":"20","retentionStrategy":"0.5,0.45"}]')