[alibaba/arthas]添加Sql语句监控命令SqlProfilerCommand

2024-04-24 25 views
0

添加专门用于监控Sql语句执行耗时的命令SqlProfilerCommand,输出内容示例:

ts=2021-08-24 14:21:07; [method=com.zaxxer.hikari.pool.HikariProxyStatement.executeQuery] [cost=0.351708ms] sql: select from org_user args: ts=2021-08-24 14:21:07; [method=com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery] [cost=0.383291ms] sql: select from org_user where age <= ? args: 18 ts=2021-08-24 14:21:07; [method=com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate] [cost=0.608084ms] sql: update org_user set age = age + ? args: 1 ts=2021-08-24 14:21:07; [method=com.zaxxer.hikari.pool.HikariProxyStatement.executeBatch] [cost=1.108833ms] sql: update org_user set age = age + 1;update org_user set age = age - 1 args: ts=2021-08-24 14:21:07; [method=com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeBatch] [cost=1.482834ms] sql: update org_user set age = age + ? args: --(10) --(20)

回答

5

创建了用于验证sqlprofiler功能的项目demo:https://github.com/yangxb2010000/arthas-sql-demo

技术实现要点:

  1. 缓存Connection创建的Statement对象
  2. 监听statement对象执行的set参数、addBatch等方法构建statement对应的sqlContext
  3. 当statement执行execute方法时,打印出sqlContext中的数据
  4. 由于常见了连接池代理了Statement和Connection方法,所以会导致执行的同一条sql语句被执行多次的问题。是基于ThreadLocal解决了该问题。
6

SqlExecuteStack 去掉记录重复sql时,具体怎么判断的? 只据sql是否一样? 但应用如果执行同样的sql,在一个线程内,执行多次呢?

3

SqlExecuteStack 去掉记录重复sql时,具体怎么判断的? 只据sql是否一样? 但应用如果执行同样的sql,在一个线程内,执行多次呢?

Statement或者PreparedStatement的execute方法运行前执行入栈操作,execute方法运行后执行出栈操作,当到达栈底时就意味着回到最外层的statement,可以打印sql语句了。

在一个线程内执行多次相同的sql语句并不影响,因为这些sql语句会顺序执行,会单独经历所有statement的execute方法。

1

老板,这个PR不合了吗

9

老板,这个PR不合了吗

没注意之前卡在CLA节点了,我重新提交一下

0

?,我的锅,这个功能是比较实用的。后面会重新评估。