node.js之定時任務+檔案讀取+INSERTALL
有個需求
每天更新一下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";