arthas icon indicating copy to clipboard operation
arthas copied to clipboard

添加Sql语句监控命令SqlProfilerCommand

Open yangxb2010000 opened this issue 3 years ago • 4 comments

添加专门用于监控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)

yangxb2010000 avatar Aug 04 '21 06:08 yangxb2010000

创建了用于验证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解决了该问题。

yangxb2010000 avatar Aug 16 '21 09:08 yangxb2010000

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

hengyunabc avatar Sep 26 '21 09:09 hengyunabc

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

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

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

yangxb2010000 avatar Sep 26 '21 10:09 yangxb2010000

CLA assistant check
All committers have signed the CLA.

CLAassistant avatar Jan 26 '22 02:01 CLAassistant

老板,这个PR不合了吗

shaoerkuai avatar May 31 '23 02:05 shaoerkuai

老板,这个PR不合了吗

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

yangxb2010000 avatar May 31 '23 03:05 yangxb2010000

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

hengyunabc avatar May 31 '23 07:05 hengyunabc