在java调优中,我们遇到一种麻烦
已知某个SQL在特定的条件下,执行很慢,但是又不知道原始的SQL是什么,这里我们有几种解决方式:
- 直接修改mybatis的日志级别,让mybatis把相关的细节都打印出来。缺点:需要改配置重启应用,测试完还要改回去,不然日志爆炸。
- 直接在线debug。缺点:线上环境无法debug,就算能debug,看到的也不是完整的SQL。
- 用arthas查看,可以在线上查看,对业务无损。缺点:输出的格式不太友好,而且很多人不知道怎么去watch。
本工具的解决的问题
不需要修改日志级别,不要调试应用,也不需要重启停止应用,只需要执行arthas对java应用进行观测,通过本工具生成的arthas的命令,对指定的DAO/Mapper的坐标进行观测。 对观测输出的结果,直接格式化为肉眼可读的方式。
操作方式
首先确定要观测的DAO/Mapper的具体坐标。
如图,入门要对指定的方法进行观测
确定最终的观测坐标是:
org.example.mid.mybatis.mapper.PersonMapper.update 【注意,方法和类之间不要有空格!!!】
登录 CtBots.com 进行分析,输入 DAO的指定坐标,点击【生成arthas语句】按钮,可以生成对应的arthas的观测语句。
在java程序的服务器上,启动arthas,输入命令进行观测【命令比较长,粘贴进去的时候,arthas显示可能有错位,但是不影响执行,直接回车即可】:
把arthas输出的结果,完整的粘贴到 ctbosts的分析框内,执行分析:
即可看到原始的执行SQL是什么。