在线诊断工具Arthas实践分享-在线debug&不停服更新

本文介绍了Arthas这款在线Java诊断工具的使用,包括如何利用其在线debug功能监听方法的入参出参,以及如何在不发版的情况下实现代码的热更新。在实际开发中,作者通过Arthas快速定位并解决了批量插入数据时的主键冲突问题,大大提高了问题解决效率。
摘要由CSDN通过智能技术生成

@auther 张念磊
@date 2021/3/27

一、Arthas简介

Arthas 是一款开源在线 Java 诊断工具,采用命令行交互模式,支持 web 端在线诊断,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。

它可以帮你解决这些问题:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到 JVM 的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?

这是官方文档对arthas的介绍,下面用我的方式介绍一下arthas。

二、我用到的Arthas

周四的开发过程中遇到一个问题:批量插入数据到数据库老是失败。

方法逻辑很简单:

  1. 定义变量,存放要插入的数据列表
  2. 开始循环组装数据
  3. 批量写入组装好的数据到数据库

方法的源代码:

	private void saveMiddleTempList(List<WordDirectoryInfo> allSceneList, String tenantsNo, String filePath, String fileName, String bizReqrmntNo) {
   
    // 1. 定义变量,存放要插入的数据列表
		List<MiddleTempEntity> insertList = new ArrayList<>(allSceneList.size());
		// 2. 开始循环组装数据
    for (WordDirectoryInfo dir : allSceneList) {
   
			String inno = generateNo.getNo(tenantsNo, GenerateNoPrefixEnum.DEMAND_SCENARIO_MIDDLE.getValue(), 18);
			MiddleTempEntity entity = new MiddleTempEntity(tenantsNo, inno, dir.getText(), null, fileName, filePath, bizReqrmntNo);
			entity.setCrtTm(LocalDateTime.now().toString());
			entity.setModfyTm(LocalDateTime.now().toString());
			insertList.add(entity);
		}
		// 3. 插入数据到数据库
		try {
   
			middleTempMapper.insertList(insertList);
		} catch (Exception e) {
   
			log.error(">>>saveMiddleTempList-数据库写入失败!", e);
			throw new CommonException("文件检查失败:数据库异常!");
		}
	}

页面上报出错误: “文件检查失败:数据库异常!” ,我熟练的连接上服务器,开始查看服务的日志

[root@172-21-21-98 ~]# less /app/x-service-xxxx/logs/spring.log

很快啊,找到了报错的位置

image-20210327121734502

“Duplicate entry ‘’ for key ‘PRIMARY’”,明眼人一看就懂,主键冲突,并且这个主键还是null。

为什么会这样?生成主键的方法【generateNo.getNo】是公共包里的,因该没得问题,是不是这个方法的入参有问题,刚好最近江华分享的工具arthas,来试试他的在线debug功能。

1. 在线debug,监听方法的入参出参

用到的命令:

watch——方法执行数据观测

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值