系统介绍

整个系统可以从功能上分为3块:

  1. 业务系统:在上游有很多的业务系统,业务系统的运行产生很多的数据,这些数据分散在很多的数据库中,大部分是MySQL数据库
  2. 数据智能平台:数据智能平台属于中台系统,主要为业务系统提供强大的数据支撑服务,下层连接数仓。
  3. 数据仓库: 数据仓库统一集中的管理所有的数据,数仓会将业务系统产生的数据按天进行加工、抽取、转换到数据仓库存储。

当一天结束后,各个业务系统产生了大量的数据,这些数据由定时任务进行加工、抽取到数据仓库存储,当半夜你还在睡觉的时候,这些定时任务就在默默的运行着。

而每天加工的数据通常要求在上班工作时间之前加工完成,然后通过数据智能平台的查询系统供业务系统查询调用,这一次数据没有查询到是因为在第二天早上10点,数据还没有加工完成。下面就是找问题优化了,因为正常来讲,即使定时任务链再长,也不会慢到第二天10点钟数据还没有出来。下面就是找问题,然后进行优化了。

任务优化

通过任务日志发现有一个上游系统的数据抽取执行时间有3个小时,而数据量仅100万。当然,光凭这样还无法确定这个任务是否是可以被优化的。

查看任务代码,逻辑还比较简单:有一张原始数据表,记录商品信息以及定义的分类(这一点是虚构的,实际情况要复杂一些,我这里精简然后转换了一下,便于理解),而数仓的目标表是将分类和商品分别存储在不同的表中,大致结构如下。

那为什么需要进行这样的转换呢? 这是因为整个大的系统,一般来说只能定义一些基本的规范,而具体的细节规范则无法约束,比如A系统的身份证字段名称为card_no,而B系统的身份证字段名称为crdt_no(这种情况大家应该经常遇到);再比如处理实体关系的时候,处理方式也是不同的,1对1的关系,可以建两张表关联,也可以一张表都存储,这就造成了多个系统的不统一性,而这种情况是不可避免的,因为从业务系统来说,都保证了系统的正常运行。

而数仓对多个原始数据处理的时候就需要考虑到兼容的问题,所以就会出现如上图的转换过程。

而这个任务执行3个小时的原因在于原始表中的一条记录,会转换到数仓表中的三张表中,而且这三张表是通过id进行关联,整个代码流程如下。

然而问题来了,100万的数据,跑了3个小时,然后我开始尝试去优化程序的执行流程,大概从一下几点入手

  1. 将分类缓存,分类在系统中已经固定,不会发生变化,缓存可以减少查询数据库的次数
  2. 每次从原表中读取的数据更多,从原来的500/次 -> 2000/次

经过优化,效率有一些提升,但并不是很明显(有同学可能要问了,这些都是很基本的,为什么最开始做? 咳咳。。。这个嘛,历史原因吧,在最开始数据可能不多,不论以什么方式执行,都差别不大,比如执行10分钟和执行20分钟,看似2倍的执行效率,但是由于没有影响到业务系统,且一直正常运行,也就没有看出问题)。

这里数据是需要关联的,所以我们是需要插入数据并拿到这条记录的自增长id,然后插入到关联表,而表结构基本不可能去动的(表结构动了那真是牵一发而动全身了,第二天准得被叫去喝茶)。

那么我们先来分析一下这里为什么执行这么慢呢。

  1. 原表100万的数据,每次查询出2000条,所以查询的总次数就是1000000/2000 = 500次,这肯定消耗不了多少时间。这里基本没有优化的空间,就算一次全部查询出来,也仅仅节省499次的查询时间(也不可能一次查询这么多数据)
  2. 查询的2000条数据,数据转换,然后依次插入到信息表以及关联表中,这里是一条一条解析执行的,总计插入数据库4000次,毫无疑问,这里是最耗时的。数据转换是必须的,而且是在内存中操作,所以耗时不是特别多;那么剩下的就是总计100万 * 2的数据库插入次数,能否进行优化呢?

首先想到的就是批量插入,批量插入可以有效的降低数据库访问次数。但是这里不能进行批量插入是因为需要取到自增长id,感觉陷入了困境。

当天晚上昨晚运动之后,抛开烦恼,觉得浑身舒坦。

突然,脑袋灵光一闪,数据库的自增长id是由数据库控制的数值,而自增长的步长我们是知道的,比如自增长步长为1,当前自增长id为1的话,那么可以肯定,下一条记录的自增长id就为2,以此类推。

那是否可以插入一条记录,取到自增长id,然后就可以计算出之后所有数据的自增长id,而不再需要每条记录都去取自增长id了。

但是这样也有一个问题,就是在数据转换导入的过程中,不能有其他的程序向表中插入数据,不然会导致程序计算的自增长id匹配不上。而这个问题根本不存在,因为数仓的数据都是由原始表计算插入的,在同一时间是没有其他的任务写这张表,那么我们就可以放心大胆的干了。

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

…(img-ZAfAYKRm-1625830247999)]

[外链图片转存中…(img-2CS9aObz-1625830248000)]

更多Java核心笔记、真实面经、学习笔记等知识干货可以点击这里免费领取

大牛深入讲解!java语言程序设计第二版答案朱庆生相关推荐

  1. “金三银四”春招指南!java语言程序设计第二版答案朱庆生

    正文 这次写一下springboot与redis的结合,这里使用的是redis集群模式(主从),主从环境的搭建,请参考redis集群搭建 搭建完redis集群环境后,开始springboot之旅 1. ...

  2. java语言程序设计第二版课后答案吴倩_Java语言程序设计

    内容概要 <java语言程序设计:面向对象的设计思想与实践>围绕面向对象的设计思想展开主题,详细讲解了java语言基础语法.面向对象的三大特征.图形用户界面的编程方法.多线程编程.java ...

  3. java语言程序设计第二版 张思民_java语言程序设计(张思民编著)习题答案.doc

    java语言程序设计(张思民编著)习题答案.doc 1第1章JAVA概述[1]为什么说JAVA的运行与计算机硬件平台无关解答JAVA编译器能够产生一种与计算机体系结构无关的字节指令BYTECODE,只 ...

  4. java语言程序设计第二版课后答案吴倩_java语言程序设计课后答案 郞波 第二版 清华大学出版社...

    展开全部 我有 Java面向对象程序设计 清华大学出版社 (编著 耿祥义 张跃平) 习题解答 建议e69da5e887aa62616964757a686964616f31333330326632使用文 ...

  5. java语言程序设计第二版课后答案吴倩_java语言程序设计课后答案

    作业参考答案 习题一 4 .如何建立和运行 Java 程序? 首先启动文本编辑器,如记事本. UltraEdit 等,编辑程序代码,并以 .Java 作为文件 扩展名保存程序源代码:然后进入 dos ...

  6. C语言程序设计(第二版) 主编:余贞侠 何钰娟 课后习题 代码题答案

    C语言程序设计(第二版) 主编:余贞侠 何钰娟 (课后习题 代码题答案) ps.由于没有官方答案,博主将自己写的代码分享出来,若有错误之处请多多谅解,转载注明出处! 版权声明:本文为CSDN博主「Ra ...

  7. [转载]汇编语言程序设计第二版答案  沈美明

    原文地址:汇编语言程序设计第二版答案  沈美明作者:相约爱情海 file:///C|/Users/CaoFan/Desktop/IBM-PC汇编语言程序设计(第二版)答案.txt[2010/4/24 ...

  8. java语言程序设计全国考试题,2019年12月全国计算机等级考试[Java语言程序设计]复习题及答案...

    &nbsp&nbsp[导读]:2019年12月全国计算机等级考试[Java语言程序设计]复习题及答案,更多全国等级考试报名时间.考试时间以及考试模拟试题 ,请访问易考吧全国等级考试栏目 ...

  9. 2014年4月java程序设计,2014年4月 Java语言程序设计(一)试题答案.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava 2014年4月 Java语言程序设计(一)试题答案.d ...

最新文章

  1. FC3服务器配置一条龙
  2. Windows10+Ubuntu 18.04.2+ROS 安装笔记(SSD单硬盘)下
  3. Serverless 实战 —— 从 DevOps 到 Serverless
  4. 开源 java CMS - FreeCMS2.5 标签 infoPage
  5. 时序分析基本概念介绍——STA概述
  6. HTTP协议请求中返回的各个状态码对应的状态信息
  7. 持续集成:软件质量改进和风险降低之道
  8. adminlte3 动态菜单_一本科学菜单,十倍利润增长 | 跟巴奴学餐饮业的精简风:菜单越薄,利润越厚!...
  9. 黑灰产技术手段不断“进阶”,如何防御双十二“羊毛党”?
  10. 基于Verilog的简易计算器
  11. 怎么用计算机弹植物大战僵尸,[原创] CE基础-自动汇编:植物大战僵尸之子弹回旋...
  12. shader函数整理
  13. windows10桌面_三大虚拟桌面软件对比,总有一款适合你!
  14. 一起聊聊什么是P问题、NP问题、NPC问题
  15. HMI-44-【多媒体】开启新篇章
  16. AI一周热闻:华为豪掷3.3亿剑桥买地,自建光芯片工厂;比特大陆IPO失败,组织架构调整...
  17. 风变编程python26_风变编程学习Python的切身体会
  18. 斜杠‘/‘ 和反斜杠‘\‘
  19. python 画图效果
  20. C++中的泛型编程有函数模板与类模板

热门文章

  1. 无法写入最后一个_U盘无法正常读写,还能识别还能抢救一下
  2. 网易微专业web前端开发课程|价值1648元
  3. 均线多头排列选股公式,选出均线多头刚起步的标的
  4. 仿 Lenovo商城首页
  5. c语言实现人民币转换成大写中文数字
  6. 计算机信息计量单位 英文名称byte,5.计算机中的字节是个常用的单位,它的英文名字为( )。...
  7. 全球及中国冬装外套行业市场需求及投资前景调研报告2022-2027年
  8. 2月12日第壹简报,星期日,农历正月廿二
  9. Android进阶七:RecyclerView拖动滑动之ItemTouchHelper
  10. 四六级备考 01 两会