Skip to content

打印执行SQL与耗时

用途

痛点: 当我们测试业务的时候,需要查看实际执行的SQL与耗时时间,很多上层的驱动会有多种开启打印的方式,很多都需要修改代码或修改配置打印。

DebugTools 通过在 jdbc 层通过 修改数据库驱动字节码 实现在运行时打印SQL与耗时,从而避免上层数据库链接池的不同影响SQL的打印。

理论上支持所有通过Jdbc链接的数据库驱动:

使用

Idea

setting -> Other Settings -> DebugTools 中配置开启或者关闭

print_sql_setting

  • Pretty: 格式化打印SQL语句
  • Compress: 压缩形式打印SQL语句
  • No: 不打印SQL
  • Auto save sql to file: 将SQL保存到文件中
  • SQL Retention Days: 保留多少天

SQL文件在.idea/DebugTools/sql 文件夹下,也可以点击 ToolsWindow 打开最新SQL文件。

sql_file.png

成功会在日志中输出 Print xxx(mysql/oracle/...) log bytecode enhancement successful

print_sql_success

打印效果如下:

text
Execute consume Time: 3 ms; Execute SQL: 
SELECT
    id,
    name,
    age,
    version 
FROM
    dp_user 
WHERE
    id=1

注意

  1. 由于 DebugTools 是通过字节码的方式打印SQL,所以修改配置后需要重新启动应用才能生效。
  2. 启动应用时开启打印SQL配置(Compress / Pretty)可以在附着应用之后进行动态修改SQL打印配置。

动态配置

启动应用时开启打印SQL配置(Compress / Pretty),可以在附着应用之后进行动态修改SQL打印配置。

dynamic_sql.png

过滤 sql

当 sql 太多的时候,我们可以配置过滤指定sql。

filter_sql_setting.png

TIP

只有开启打印 sql 的时候才能看见忽略 SQL 的配置

支持如下的四个配置

  • sql.print.packages:打印指定调用链路包下的SQL
    • 识别方式是通过执行线程堆栈信息是否正则匹配配置的包名
    • 该配置优先级高于 sql.print.ignore-packages
    • 支持正则
  • sql.print.ignore-packages:忽略打印指定调用链路包下的SQL
    • 识别方式是通过执行线程堆栈信息是否正则匹配配置的包名
    • 如果配置了 sql.print.packages 则该配置失效
    • 支持正则
  • sql.print.statement:打印指定SQL语句
    • 该配置优先级高于 sql.print.ignore-statement
    • 支持正则
  • sql.print.ignore-statement:忽略指定SQL语句
    • 如果配置了 sql.print.statement 则该配置失效
    • 支持正则

文件内容就是普通的txt,内容写到对应段的下面,支持 #; 注释。[[xxx]] 是固定格式。支持多行。如:

txt
[[sql.print.packages]]
com.example.demo
com.example.test

[[sql.print.ignore-packages]]
com.example.demo
com.example.test

[[sql.print.statement]]
select 1
select * from user

[[sql.print.ignore-statement]]
select 1
select * from user

警告

最好不要在生产环境中使用

因为 DebugTools 通过 修改数据库驱动字节码 来实现SQL的打印,可能出现兼容不到位或者其他考虑不到的情况,生产环境可能存在风险。