2020-03-08 补偿任务死循环

背景

由于数据同步链路太长,偶尔出现数据不一致的bad case,为了解决该问题,添加了全量数据的补偿任务,即分批次扫描全表数据,然后串行同步

现象

上游同学凌晨2点群里同步,某批id一天更新次数高达25w次,影响到了上游数据表性能

异常编码
import java.util.ArrayList;
import java.util.List;

public class Task {
    void sync() {
        while (true) {
            Long offset = 0L;
            try {
                List<Shop> res = ShopDao.get(offset, 20L);/*每次查20条*/
                for (Shop shop : res) {
                    try {
                        del(shop);
                    } catch (ServiceException e) {
                        /*打印日志*/
                    }
                }
                offset = res.get(res.size()-1).id; /*id为数据表主键id*/
            }catch (Exception e){
                /* 打印日志*/
            }
        }
    }

    void del(Shop shop) throws ServiceException {
        throw new ServiceException();
    }


}

class ShopDao {
    static List<Shop> get(Long offset, Long limit) {
        /* "select * from shopTable where id>#{offset} limit #{limit} order by id";*/
        return new ArrayList<>();
    }
}

class Shop {
    Long id;
}

class ServiceException extends Exception {
}
异常原因

串行执行批量任务时,执行任务组只catch了ServiceException,但是在这个批次中,有一个店铺抛出的异常并不是ServiceException,导致了查询数据表的fromId每次都得不到更新,即进入死循环

解决

将每组任务的catch异常改为Exception

反思
  • 编写代码时注意细节
  • 使用while(count<n)替代while(true),n为大于任务数量的异常定值,在执行完任务时,记录n,如果n>数据表的数量,则说明代码存在异常
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 10,148评论 1 114
  • 1. file n. 文件;v. 保存文件2. command n. 命令指令3. use v. 使用用途4. p...
    喵呜Yuri阅读 4,101评论 0 4
  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 4,320评论 0 3
  • 第01章 JAVA简介第02章 基础语法第02章 递归补充第03章 面向对象第04章 异常处理第05章 数组第06...
    顺毛阅读 3,430评论 0 1
  • 不足的地方请大家多多指正,如有其它没有想到的常问面试题请大家多多评论,一起成长,感谢!~ String可以被继承吗...
    启示录是真的阅读 8,065评论 3 3