• node.js异步模型插入万条excel数据,为了不搞挂系统怎么办?


    需求

    xx银行需要把历史数据几万条excel数据导入生产,表格内容多样。

    分析

    • 工作量、时间紧、坑多
    • 直接for循环插入会把系统给搞挂。据说其他同事这么干,把生产搞挂了。哈哈!!
    • 7.8台集群,没充分利用,扛不起瞬间插入的压力。

    方案

    • 不调用http请求插入接口,采用框架提供的client api 来减少我分析报文的工作量,同时绕过复杂的登录机制,顺便以面向对象方式操作数据代码可读性更好。
    • for循环插入中sleep一下

    难点

    • client api 是promise异步模型,而且js中不提供sleep,该怎么解决?

    测试版本1

    
    function sleep (time:any) {
      return new Promise((resolve) => setTimeout(resolve, time));
    }
    
    for(let i= 0 ;i<1000;i++){
      sleep(1000).then(() => {
        console.info(new Date().pattern("yyyy-MM-dd hh:mm:ss"))
      })
    }
    
    Date.prototype.pattern=function(fmt) {
      var o = {
        "M+" : this.getMonth()+1, //月份
        "d+" : this.getDate(), //日
        "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时
        "H+" : this.getHours(), //小时
        "m+" : this.getMinutes(), //分
        "s+" : this.getSeconds(), //秒
        "q+" : Math.floor((this.getMonth()+3)/3), //季度
        "S" : this.getMilliseconds() //毫秒
      };
      var week = {
        "0" : "/u65e5",
        "1" : "/u4e00",
        "2" : "/u4e8c",
        "3" : "/u4e09",
        "4" : "/u56db",
        "5" : "/u4e94",
        "6" : "/u516d"
      };
      if(/(y+)/.test(fmt)){
        fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
      }
      if(/(E+)/.test(fmt)){
        fmt=fmt.replace(RegExp.$1, ((RegExp.$1.length>1) ? (RegExp.$1.length>2 ? "/u661f/u671f" : "/u5468") : "")+week[this.getDay()+""]);
      }
      for(var k in o){
        if(new RegExp("("+ k +")").test(fmt)){
          fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
        }
      }
      return fmt;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    测试效果
    在这里插入图片描述

    尴尬看输出时间没有间隔一秒啊,对因为是异步模型吗,在测试环境果然系统挂了。

    改进2

    var interval = 1 * 1000; // 10 seconds;
    
    for(let i= 0 ;i<1000;i++){
        setTimeout( function (i) {
            console.info(new Date().pattern("yyyy-MM-dd hh:mm:ss"))
    
        }, interval * i);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    image.png
    嗯,一秒执行一次,很安全

    解析excel

    解析用node-xlsx

    const xlsx = require('node-xlsx');      // 读写xlsx的插件
    const workSheetsFromFile = xlsx.parse('./a.xlsx', {cellDates: true})
        workSheetsFromFile.forEach((workSheet: any) => {
            for (let h = 1; h < workSheet.data.length; h++) {
                let row: any = {};
                for (let c = 0; c < workSheet.data[h].length; c++) {
                    let cell = workSheet.data[h][c];
                }
            }
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    一口气说出 Redis 16 个常见使用场景
    数据图表软件-FineReport控件简介
    个人的微信公众号如何变更主体?
    国内低代码平台有哪些
    EdgeCloudSim官方Sample运行——Windows+IntelliJ IDEA+Matlab
    学习大数据DAY33 Flask 库 API 开发介绍,OS 库,pandas 库和简单爬虫
    领英辅助工具领英精灵分组功能解析
    数据泄漏、删除事件频发,企业应如何构建安全防线?
    洛谷题单 【入门3】循环结构
    vue全局事件总线
  • 原文地址:https://blog.csdn.net/huangmingleiluo/article/details/126902769