使用knex从文件读取并插入到数据库结束时出错

时间:2016-02-21 03:45:39

标签: javascript node.js knex.js

我有一小段代码从文件中读取一行,解析它然后插入到我的数据库中。

然而,在10到12万行后,我总是会收到此错误:

Unhandled rejection Error: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?

第一个文件大约有150k行。

已经尝试直接操纵交易,但没有成功。

有关如何正确管理资源以制作所有文件的任何想法?

以下是我现在尝试的代码:



var fs = require('fs');
var knexfile = require('./knexfile');
var knex = require('knex')(knexfile.production);
var readline = require('readline');

var rl = readline.createInterface({
  terminal : false,
  input : fs.createReadStream('FOO_BAR.TXT') // About 150k lines
});
knex.transaction(function(tx){
  rl.on('line', function(line) { 
    knex("dadosbrutos").insert({ // this table does exists
      AA_DATA : line.substring(0,8),
      BB_DATA : line.substring(8,16),
      CC_DATA : line.substring(36,44)
    }).then(function(){
      tx.commit(); // dies after 12k inserts
    });
  });
});




1 个答案:

答案 0 :(得分:0)

我创建了一个模块来宣传readline https://www.npmjs.com/package/readline-promise,但是在这篇文章中包含了我的回答。

还要确保您没有超过数据库的最大事务大小。

您需要使用交易吗?如果没有,你可以在没有交易的情况下完成所有插入。

var fs = require('fs');
var promise = require('bluebird');
var knexfile = require('./knexfile');
var knex = require('knex')(knexfile.production);

// iterates through each line calling callback
function each(cfg) {
    return function(callback) {
        return new promise(function(resolve, reject) {

            // create an array to store callbacks
            var rl, cbs = [];

            // create an interface
            try {
                rl = readline.createInterface(cfg);
            }
            catch(err) {
                return reject(err);
            }

            // handle a new line
            rl.on('line', function(line) {
                cbs.push(callback(line));
            });

            // handle close
            rl.on('close', function() {
                promise.all(cbs).then(function() {
                    resolve({
                        lines: cbs.length
                    });
                })
                .caught(function(err) {
                    reject(err);
                });
            });
        });
    };
}

knex.transaction(function(tx){
    return each({
        terminal : false,
        input : fs.createReadStream('FOO_BAR.TXT')
    })(function(line) {
        return knex("dadosbrutos").insert({ // this table does exists
            AA_DATA : line.substring(0,8),
            BB_DATA : line.substring(8,16),
            CC_DATA : line.substring(36,44)
        }).transacting(tx);
    })
    .then(function() {
        tx.commit();
    });
});