文章目录

  • 故障背景
  • 故障分析
  • 故障重现
  • 解释总结
故障背景

某公司进行一年一度的跨年上线工作,在2018年的12月30号上午忽然接到保障业务无法运行,而且影响全国业务。

故障分析

第一步:因为近期没有业务上线活动,首先排除因上线因此引起的故障
第二步:分析业务日志。发现业务中报错的原因是没有查到业务表中前期存的业务数据
第三步:查询前期存表操作,查找是什么原因导致业务数据没有存到数据库中。然后发现业务中并没有抛出任何存表异常(这是一个坑,笔者也跳进去了饶了好几次才发现)。此处解释一下:因为业务数据量比较大,因此业务上采取的是分年月的分表规则进行业务信息存储,同时此时属于跨年的时间节点,业务上一般会提前一周将下一年的表结构刷入数据库中。
第四步:故障定位。上面的数据库确实没报错,然后通过显示mybatis中sql语句方式,看到sql入的表是T_BUSI_201912的表,也就是说本来如表应该是T_BUSI_201812的表现在存到表T_BUSI_201912,很明显,这里的分表日期计算错了。因为T_BUSI_201912表结果已经提前刷入生产环境,因此没有出现入库异常。

故障重现

根据上面的分析,我们找到了错误的原因开发者使用的是YYYYMMdd格式化当前日期。那现在就用测试代码重现一下当时的故障。测试代码如下所示:

    /*** 故障重现*/public static void  troubleReproduce() throws ParseException {//业务中使用的日期格式化方式String formate1 = "YYYYMMdd";//比较格式化方式String formate2 = "yyyyMMdd";//这个是故障发生的时间String dateTime = "20181230";//这个是故障发生前一天的时间String dateTimeTest = "20181229";//这个是将字符串转换成时间Date date = new SimpleDateFormat(formate2).parse(dateTime);Date dateTest = new SimpleDateFormat(formate2).parse(dateTimeTest);System.out.println("使用[" + formate1 + "]格式化前后{"+dateTime+"} -> " + (new SimpleDateFormat(formate1).format(date)));System.out.println("使用[" + formate2 + "]格式化前后{"+dateTime+"} -> " + (new SimpleDateFormat(formate2).format(date)));System.out.println("-----------------分割线---------------------");System.out.println("使用[" + formate1 + "]格式化前后{"+dateTimeTest+"} -> " + (new SimpleDateFormat(formate1).format(dateTest)));System.out.println("使用[" + formate2 + "]格式化前后{"+dateTimeTest+"} -> " + (new SimpleDateFormat(formate2).format(dateTest)));}

打印结果如下:

使用[YYYYMMdd]格式化前后{20181230} -> 20191230
使用[yyyyMMdd]格式化前后{20181230} -> 20181230
-----------------分割线---------------------
使用[YYYYMMdd]格式化前后{20181229} -> 20181229
使用[yyyyMMdd]格式化前后{20181229} -> 20181229

这个例子就重现了案发现场,如果是2018年12月29号的时候系统都能正常运行,到了2018年12月30号的时候系统就无法正常运行了,应该存T_BUSI_201812表的数据错误的存入T_BUSI_201912中。

解释总结

上面成功找到了问题的原因,那我们要刨根问题为什么YYYYMMdd和yyyyMMdd得到的结果是不一样的,为什么YYYYMMdd出现的结果是不对的?
因为YYYY是week-based-year,表示当天所在的周属于的年份,2018年的12月30号是周日,周日在西方人认为是一周的第一天,因此本周存在跨年(2019年),所以就算入下一个年份中了。 但是2018年12月29号是本周的最后一天,这一周都在2018年,因此显示是正常的。
所以这一点程序员要谨记,尽量不要使用YYYY这样的年份规则。

跨年过程中因日期格式化引发的生产故障:格式化方式YYYYMMdd和yyyyMMdd的区别相关推荐

  1. linux怎么查看一个bam文件,生信分析过程中这些常见文件的格式以及查看方式你都知道吗?...

    原标题:生信分析过程中这些常见文件的格式以及查看方式你都知道吗? 生信分析过程中,会与很多不同格式的文件打交道,除了原始测序数据 fastq 之外,还需要准备基因组文件 fasta 格式和基因注释文件 ...

  2. 跨链揭秘:跨链过程中你的资产真的转移了么?

    随着越来越多新公链的上线,用户进行资产跨链的需求也同步增长.这种趋势在带火了一众跨链桥项目后,经由各种跨链桥铸造的资产数量也急剧增长. 随着跨链资产获得更广泛的使用,与之相关的问题也越来越多.比如,我 ...

  3. 生信分析过程中这些常见文件的格式以及查看方式你都知道吗?

    生信分析过程中,会与很多不同格式的文件打交道,除了原始测序数据fastq之外,还需要准备基因组文件fasta格式和基因注释文件gtf格式.在分析的过程中还会有众多中间文件的生成,如bed.bed12. ...

  4. html获取此次点击的id,github项目解析(八)--Activity启动过程中获取组件宽高的三种方式...

    转载请标明出处:1片枫叶的专栏 上1个github小项目中我们介绍了避免按钮重复点击的小框架,其实现的核心逻辑是重写OnClickListener的onClick方法,添加避免重复点击的逻辑,即为第2 ...

  5. mysql安装apply_MySQL安装过程中出现“APPLY security settings错误”的解决方式

    近期准备自学MySQL.于是对比网上的教程自己安装了一遍,结果因为某种原因准备卸载准备又一次安装,但安装到最后一步提示"APPLY security settings错误".四处寻 ...

  6. 一个进程在执行过程中可以被中断事件打断_Linux操作系统:中断类型和中断的作用...

    1.中断的概念 中断对于操作系统非常重要,它就好像机器中的齿轮,驱动各部件的动作.所以,许多人称操作系统是由"中断驱动"的. 所谓中断是指CPU对系统发生的某个事件做出的一种反应, ...

  7. 浅谈餐饮业油烟监测过程中存在的问题及应对措施

    安科瑞 须精燕 摘要:餐饮业是当前生活中不可缺少的一部分,但是餐饮业中存在不同程度的油烟问题,成为当前关注所在.餐饮业油烟监测涉及到的内容相对比较多,在实施中要明确排放油烟的具体依据.但是在餐饮业油烟 ...

  8. 共享安装 cacti 过程中的一些经历 cacti 中文-linux - sun solaris

    项目有个需求,原来安装 cacti 的机器要革掉,需要在另一台机器上部署 cacti, 原来安装的人调走了,没有人指导,完全依靠自己在网络上寻找资料,摸索, 由于 linux/unix 基础差,走了很 ...

  9. Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...

    在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目 ...

最新文章

  1. solaris磁带设备使用方法总结
  2. 附带数据库的应用程序
  3. 上传ML模型,一键可视化,终于能看懂神经网络到底在干啥了
  4. CTF入门--http请求头
  5. 如何在网页中插入Flv视频文件
  6. vue的双向绑定原理及实现
  7. java 压缩jar 仓库,java服务安装(一):使用java service wrapper及maven打zip包
  8. node.js中对 redis 的安装和基本操作
  9. Node.js 学习笔记 - 学习《深入浅出Node.js》-朴灵
  10. Raki的读paper小记:LOOKING BACK ON LEARNED EXPERIENCES FOR CLASS/TASK INCREMENTAL LEARNING
  11. 阿里巴巴-码出高效+阿里巴巴Java开发手册(华山版)PDF下载
  12. 正定矩阵、正定矩阵与极值的关系、黑塞矩阵、牛顿法
  13. 麦肯锡三部曲_《麦肯锡精英高效阅读法》| 认知的四种境界,来看看自己在哪一层...
  14. Redis技能—底层IO多路复用
  15. python代码加密解密_Python实现对字符串的加密解密方法示例
  16. 我的开源项目:C++ Qt高仿QQ影音视频播放器
  17. 电脑桌面宠物java,java 桌面动态宠物
  18. 我为什么要写博客,写博客的意义是什么
  19. 怎样用360查看计算机使用记录,电脑360浏览器历史记录怎么查看
  20. 模糊控制初学入门之概念认知

热门文章

  1. MIGO相关的3个BADI增强点
  2. SAP 权限对象设置及在程序中的应用
  3. 爱优腾芒“跑马圈地”,AI广告营销能拯救“盈利难”的视频平台吗?
  4. oracle用dba登陆怎么登,以SQLDBA身份登录isqlplus
  5. php人工智能客服,人工智能技术在客服中心的四大应用
  6. 验证码生成java_JAVA-验证码生成
  7. Python教程:多态与多态性
  8. python socket实现文件传输(防粘包)
  9. python之高级的文件操作shutil模块
  10. catboost原理以及Python代码