繁体   English   中英

使用 node.js 向 mysql 插入多行

[英]Inserting many rows to mysql using node.js

我正在尝试将一个大文件导入数据库。 在尝试通过 mySQL 导入为 csv 文件多次失败后,我决定创建一个小节点脚本,可以读取文件并逐条插入记录。

我有大约 10 个不同格式的文件,每个文件 80mb。 当前脚本用于一个文件,每行都有一个 id,仅此而已(这个特定的表只包含一个 id 字段和一个状态字段),这是它的当前状态:

var mysql      = require('mysql');
var connection = mysql.createConnection({
    host     : 'hostname',
    user     : 'username',
    password : 'password',
    database : 'database'
});

var rl = require('readline').createInterface({
    input: require('fs').createReadStream('fileToRead.txt')
});

connection.connect();
rl.on('line', function (line) {
    var query = 'REPLACE INTO database.tablename(field1,field2) VALUES ("'+line+'",0);';
    connection.query(query, function(err) {
        if (err) {
            console.log("ERR:"+err);
            connection.end();
        }
    });
});

它工作了大约十到十二行,然后抛出以下错误:

   <--- Last few GCs --->

   51338 ms: Scavenge 699.0 (738.6) -> 699.0 (738.6) MB, 8.7 / 0 ms (+ 15.0 ms i
n 1 steps since last GC) [allocation failure] [incremental marking delaying mark
-sweep].
   53709 ms: Mark-sweep 699.0 (738.6) -> 698.9 (738.6) MB, 2360.5 / 0 ms (+ 15.0
 ms in 2 steps since start of marking, biggest step 15.0 ms) [last resort gc].
   56065 ms: Mark-sweep 698.9 (738.6) -> 698.9 (738.6) MB, 2360.2 / 0 ms [last r
esort gc].



    <--- JS stacktrace --->
==== JS stack trace =========================================

Security context: 1DF25599 <JS Object>
    1: emit [events.js:~117] [pc=23C30364] (this=1027D245 <a Protocol with map 3
2339A39>,type=1DF4D5B1 <String[7]: enqueue>)
    2: arguments adaptor frame: 2->1
    3: _enqueue [path\node_modules\mysql\lib\protocol\
Protocol.js:~128] [pc=107BD3D8] (this=1027D245 <a Protocol with map 32339A39>,se
quence=157A3225 <a Query with map 3233C379>)
    4: /* anonymous */ [path...

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory

我不习惯节点,所以我真的不知道这意味着什么。 我相信这与从比查询移动得更快的循环内部调用的查询有关,但我不确定它,如果是这种情况,也不知道如何处理它。

任何帮助表示赞赏。

对不起,如果我的英语不及格。

问题是您在第一个查询结束后结束与数据库的连接,因此,只应执行有足够时间进入数据库的查询量,我的猜测是只会插入第一个(也许我在这里错了)。

由于您可能正在执行节点的“一次性脚本”,因此您只需删除该行即可解决问题,如下所示:

var mysql      = require('mysql');
var connection = mysql.createConnection({
    host     : 'hostname',
    user     : 'username',
    password : 'password',
    database : 'database'
});

var rl = require('readline').createInterface({
    input: require('fs').createReadStream('fileToRead.txt')
});

connection.connect();
rl.on('line', function (line) {
    var query = 'REPLACE INTO database.tablename(field1,field2) VALUES ("'+line+'",0);';
    connection.query(query, function(err) {
        if (err) {
            console.log("ERR:"+err);
            //I am not closing the connection anymore
        }
    });
});

如果您的脚本多次有用(一个月一次,一天一次或类似的情况),我会建议一个更好的解决方案,也许使用异步和连接池。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM