NodeJS + MySQL,不能从应用程序访问数据库,但可以从terminal访问

我有一个大数据数组,我试图插入到我的数据库中,然后删除一个旧表并重命名新的。 为了更快地做到这一点,我使用TRANSACTION(它不会影响我的问题,我试过没有它),并使每个MySQL查询内async.each函数。 在这个async.each的callback中,我做了COMMIT(用于事务),删除和重命名。

通常我有100000或更多行插入。 如果我在terminal中使用“SELECT COUNT(*)”,我可以看到这些行插入相当缓慢,但是当插入1/4行时,该过程会立即结束。 然后,我在一会儿得到了一张桌子。 我不知道为什么会发生,我确定,但也许这是我的问题的原因。

所以这是我的问题:我插入时无法从节点访问数据库。 但我仍然可以从terminal访问它,我可以计数行,看到一个表等。如果节点用mysql查询调用其他函数,这个查询将等待,直到大插入将结束。 这就像节点代码并行工作,但mysql查询工作在一个线程。 我怎样才能解决这个问题?

exports.insertSubscribers = function(data, db_name, done){ state.pool.query('START TRANSACTION'); async.each(data, function(row, cb){ state.pool.query('INSERT INTO new_' + db_name + ' (id, first_name, last_name, sex, city, country, photo_200) VALUES (' + "'" + row.id + "', " + "'" + row.first_name + "', " + "'" + row.last_name + "', " + "'" + row.sex + "', " + "'" + JSON.stringify(row.city) + "', " + "'" + JSON.stringify(row.country) + "', " + "'" + row.photo_200 + "'" + ')', cb); }, end_transaction); function end_transaction(){ state.pool.query('COMMIT', function(err){ if(err) return done(err); state.pool.query('SHOW TABLES LIKE \'' + db_name + '\'', function(err, result){ if(result.length != 0){ state.pool.query('DROP TABLE ' + db_name, function(err){ if(err) return done(err); state.pool.query('RENAME TABLE new_' + db_name + ' TO ' + db_name, function(err){ if(err) return done(err); }); }); }else{ state.pool.query('RENAME TABLE new_' + db_name + ' TO ' + db_name, function(err){ if(err) return done(err); }); } }); }); } }; 

MySQLdevise只允许在任何给定的时间每个连接最多一个查询。 那么一些MySQL驱动程序/模块所做的就是简单地维护一个内存中的队列,这个队列在另外一个查询正在进行时被使用。

一个可能的解决方法是在一个池中使用多个连接(例如mysqlmysql2模块具有内置池支持),以便可以并行执行更多的查询。