有个需求
每天更新一下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";