arthas
arthas copied to clipboard
添加Sql语句监控命令SqlProfilerCommand
添加专门用于监控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)
创建了用于验证sqlprofiler功能的项目demo:https://github.com/yangxb2010000/arthas-sql-demo
技术实现要点:
- 缓存Connection创建的Statement对象
- 监听statement对象执行的set参数、addBatch等方法构建statement对应的sqlContext
- 当statement执行execute方法时,打印出sqlContext中的数据
- 由于常见了连接池代理了Statement和Connection方法,所以会导致执行的同一条sql语句被执行多次的问题。是基于ThreadLocal解决了该问题。
SqlExecuteStack 去掉记录重复sql时,具体怎么判断的? 只据sql是否一样? 但应用如果执行同样的sql,在一个线程内,执行多次呢?
SqlExecuteStack 去掉记录重复sql时,具体怎么判断的? 只据sql是否一样? 但应用如果执行同样的sql,在一个线程内,执行多次呢?
Statement或者PreparedStatement的execute方法运行前执行入栈操作,execute方法运行后执行出栈操作,当到达栈底时就意味着回到最外层的statement,可以打印sql语句了。
在一个线程内执行多次相同的sql语句并不影响,因为这些sql语句会顺序执行,会单独经历所有statement的execute方法。
老板,这个PR不合了吗
老板,这个PR不合了吗
没注意之前卡在CLA节点了,我重新提交一下
😂,我的锅,这个功能是比较实用的。后面会重新评估。