node.js之定时任务+文件读取+INSERTALL

来源:互联网 发布:vb里头mid函数查找 编辑:程序博客网 时间:2024/06/06 03:40

有个需求

每天更新一下oracle数据库中的某张表

数据来自与csv文件 四个字段,用逗号分割

大约千万条,测试数据有298W条


引入定时任务模块

var schedule = require('node-schedule');

var start=require("~~~~")

定义规则

 var rule = new schedule.RecurrenceRule();
            rule.dayOfWeek = [0, new schedule.Range(1, 6)];
            rule.hour = 15;
            rule.minute = 48;
            var j = schedule.scheduleJob(rule, function(){
                BlmLog.info("[schedule] [start]:Success !!");
                start.start();
            });

如:每周15:48执行任务,即 引入的start的start方法

start方法:

引入:

 var fs = require("fs");
 var readline = require('readline')

读取csv文件中的每一行  拼接成sql放入数组

会在dao、中遍历数组

与INSERT ALL组成最终的sql语句

6000条一插

设置成500条的时候 对oracle请求过于频繁会报错

6000条又有点慢

this.start=async() =>{        const re = await dao.clearTable();        var i=0;        console.log("start read!");        var rl = readline.createInterface({            input: fs.createReadStream('vlcc_ship_track.csv')        });        rl.on('line', async(line)=>{            var results=line.split(",");            if(results.length==4){            var sql = "INTO 表名 VALUES ('"+results[0]+"','"+results[1]+"','"+results[2]+"','"+results[3]+"')";            data.push(sql);}            i++;            if(i==6000){                i=0;                rl.pause();//暂停一哈,传入data                dao.insert(data);                data.length=0;                await rl.resume();            }        });
    rl.on('close', async(line) =>{            await dao.insert(data);//不够6000条,剩下的也插入            console.log("read end!");        });      }
清空表用truncate table 表名

INSERT ALL写法:

var sql_data="";
        for (var i=0;i<data.length;++i){
            sql_data=sql_data+data[i]+" ";
        }

 var sql = "INSERT ALL "+sql_data+" select 1 from dual";




原创粉丝点击