我正在尝试从SQL服务器获取数据并插入MySQL。我已经获得了大约1个lac的记录。记录的获取是正确完成的,但在将记录插入MySQL期间,它不会立即插入数据。我需要刷新MySQL以查看新记录。
var sql = require('mssql');
var mysql = require("mysql");
var config = {
user : 'sa',
password : '******',
server : 'serverurl',
database : 'DB',
stream : true //work with large amount of rows
};
var connection1 = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root',
database : 'test'
});
connection1.connect();
var connection = new sql.Connection(config, function(err) {
if(err)
console.log(err);
var request = new sql.Request(connection);
// request.stream = true; // You can set streaming differently for each request
request.query('select TOP 100000 * FROM ShipmentAuditLog WITH (NOLOCK)'); // or request.execute(procedure);
request.on('recordset',function(col){
console.time('Time-Taken');
});
// Emitted for each row
request.on('row', function(row) {
syncing(row);
// console.log('Row Inserted');
});
request.on('error', function(err) {
console.log(err);
});
// Emitted for the last one
request.on('done', function(returnValue) {
console.timeEnd('Time-Taken');
connection.close();
});
});
var syncing = function(row){
connection1.query('INSERT INTO shipmentauditlog SET ?', row, function(err,res) {
if(err)
console.log(err);
// else
// console.log('Added');
});
};
答案 0 :(得分:0)
我试图在尝试将数千条假记录插入MySQL数据库时重新创建相同的效果。这显然会使日志超载(因为符合ACID),因此您有两种选择 - 在插入期间放松ACID合规性(请参阅this answer),尽管这通常是一个非常糟糕的想法,或者更好的解决方案,是使用NodeJS批量插入记录而不是逐个插入记录。
我建议你根据记录的大小,一次读取20或30个,并构建一个多插入来将数据添加到MySQL。请参阅this link for the MySQL documentation。
所以你最终会做这样的事情:
'INSERT INTO shipmentauditlog VALUES (1,2,3), (1,2,3), (1,1,1), (1,1,3);'
另一种选择,如果这是一次大规模的一次性操作,就是使用NodeJS读取所有记录并创建包含所有数据的TXT文档。 MySQL非常支持批量加载大量数据。这会快得多,因为MySQL会批量读取文件中的数据并随着它的推移插入它。如果我不得不加载大量数据,那将是我的首选。有关详细信息,请参阅MySQL Documentation。
一个简单的例子是:
LOAD DATA INFILE 'mydata.txt' INTO TABLE shipmentauditlog
FIELDS TERMINATED BY ',';