1. 程式人生 > >node.js之定時任務+檔案讀取+INSERTALL

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";