问答

Nodejs:将大量行批量插入到数据库中

 来源    2019-06-29    1  

我想批量处理大量记录(> 400k)并将它们插入数据库.

我知道如何使用for()或underscore.each()迭代数组,并且我知道如何异步地将记录插入到各种(无)SQL数据库中.这不是问题 – 问题是我无法想办法同时做两件事.

数据库分发本身不起作用,该原则适用于具有异步接口的任何(NO)SQL数据库.

我正在寻找一种模式来解决以下问题:

循环方法:

var results = []; //imagine 100k objects here
_.each(results,function(row){
  var newObj = prepareMyData(row);

  db.InsertQuery(newObj,function(err,response) {
    if(!err) console.log('YAY, inserted successfully');
  });

});

这种方法显然存在缺陷.它有点使用插入查询来锤击数据库而无需等待单个数据库完成.说到使用连接池的MySQL适配器,很快就会耗尽连接并且脚本失败.

递归方法:

var results = []; //again, full of BIGDATA ;)
var index = 0;
var myRecursion = function()
{
  var row = results[index];
  var data = prepareMyData(row);
  db.InsertQuery(data,function(err, response)
  {
    if (!err)
    {

    console.log('YAY, inserted successfully!');
    index++; //increment for the next recursive call of:
    if (index < results.length) myRecursion();
    }
  }
}
myRecursion();

虽然这种方法适用于小块数据(虽然它可能很慢,但没关系.事件循环可以休息一段时间,等待查询完成),它不适用于大型数组 – 太多的递归.

我可以用PHP等任何其他过程语言轻松编写批量插入,但我不想这样做.我想在nodejs中异步解决这个问题 – 出于教育目的.

有什么建议?

我找到了一个适合我的解决方案,但我仍然有兴趣了解这在技术上如何运作.

阅读node-async文档我发现了一些实现这个功能的函数:

async.map //遍历数组

async.each //并行迭代数组

async.eachSeries //按顺序迭代数组

async.eachLimit //与n(限制)并行调用并行迭代数组.

例如:

var results = []; //still huge array
// "4" means, async will fire the iterator function up to 4 times in parallel
async.eachLimit(results,4,function(row,cb){
  var data = prepareMyData(row);
  db.InsertQuery(data,function(err, response)
  {
    if (!err)
    {
        cb(err,response);
    }
  }
},function(err,res)
{
    console.log('were done!');
});
php 将二维数组批量插入到数据库中
日志$arr = array( array('id'=>4,'name'=>'ceshi4'), array('id'=>5,'name'=>'ceshi5'), array('i ...
1
如何使用java spring框架将多个行从Web表单插入到数据库中
问答我是Java Spring Framework的新手,我的新项目有一个要求. 使用Spring框架,我有一个带set和get方法的POJO类. 我也有中级java服务和Web类.我使用了标记从jsp映 ...
1
sql – 批量插入Oracle数据库:哪个更好:FOR Cursor循环还是简单选择?
问答哪个是批量插入Oracle数据库的更好选择? 一个FOR Cursor循环就像 DECLARE CURSOR C1 IS SELECT * FROM FOO; BEGIN FOR C1_REC IN ...
1
在iPhone上将很多行插入sqlite数据库中的最快方式
问答有人可以解释什么在iPhone上使用FMDB插入大量数据的最佳方法是?我看到像使用beginTransaction命令的东西.我真的不知道这个或setShouldCacheStatements做什么. ...
1
Haskell持久性插入行(如果尚未在数据库中)
问答我正在尝试使用Yesod并持久创建一个网站.我对如何使用持久API感到有点困惑. 这是我的两张桌子 Feed url Text UniqueFeed url Subscription feed Fee ...
1
将数据批量插入Oracle数据库的最佳方法
问答我将创建许多数据脚本,如INSERT INTO和UPDATE 如果不是1,000,000,将会有100,000多条记录 快速将此数据导入Oracle的最佳方法是什么?我已经发现SQL Loader对此 ...
1
如何使用Python将批量插入Oracle数据库?
问答我有一些每月的天气数据,我想插入一个Oracle数据库表,但我想插入相应的记录在一个批次,以便更有效率.任何人都可以建议我如何在Python中做这个事情? 例如,我们的表格有四个字段:站号,日期和两个 ...
1
如何通过iphone编程将多行数据插入sqlite数据库
问答我是iphone开发的新手.我想在我的sqlite3数据库中插入多个值并在tableview中显示内容.我能够将单行数据插入到我的数据库中并检索它并显示数据但我无法插入多行数据.这是我的代码-- -( ...
1
在Hibernate中插入多行 – 批量插入
问答我在我的DAO类中使用以下事务代码单元在Hibernate中插入多行. @Override @SuppressWarnings("unchecked") @Transactiona ...
1
在HTML 5 / Javascript中批量插入客户端数据库(WEB SQL)
问答是否可以在HTML 5中的客户端数据库中使用批处理操作?::我假设你指的是WebSQL? 这时,WebSQL基本上是一个包装器中的SQLite. SQLite does not support在一个I ...
1
java 高效批量插入 sqlserver 数据库
日志@Test public void clockingIn_Img() throws Exception{ DbJdbc idb = DbMaster.getIDB("JXT"); ...
1
mysql存储过程命令行批量插入N条数据命令
日志原文:http://blog.csdn.net/tomcat_2014/article/details/53377924 delimiter $$ create procedure myproc () ...
1
Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
日志转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1      背景 系统中需要批量生成单据数据到数据库表,所以采用 ...
1
C# OracleBulkCopy 批量插入oracle数据库的方法
日志只有安装了oracle 11G客户端的机器上才可以用,要用到ODP.NET组件中的oracleDataAccess.DLL,命名空间引用为Oracle.DataAccess.Client; 引用:Or ...
SQL Server中中数据行批量插入脚本的存储实现
日志    看到博友SQL Server MVP桦仔的一篇博文“将表里的数据批量生成INSERT语句的存储过程的实现”.我仔细看来博文中的两个存储代码,自我感觉两个都不太满意,都是生成的单行模式的插入,数 ...
1
DataTable 批量插入SqlServer数据库 使用:SqlBulkCopy
日志简单使用: private void UpdateTitle(DataTable dt) { if (dt != null && dt.Rows.Count > 0) { usi ...
1
C#批量插入Sybase数据库,Anywhere 8
日志数据库版本是Adaptive Server Anywhere 8 1.添加引用,程序集 iAnywhere.Data.AsaClient.这个和SQLServer的System.Data.SqlCli ...
1
C#动态创建Gridview及批量插入到数据库
日志这里介绍两种动态创建Gridview的方法: (一).有时需要应付上头领导的检查,所以就弄一些静态的Gridview来显示数据,这种方法的优点就是不用连接数据库,比较方便,但是代码灵活性不高,所有数据 ...
1
C# 将DataTable表中的数据批量插入到数据库表中的方法
日志C#中有时候需要将内存中的数据批量插入到数据库表中,使用for循环进行批量插入不但耗时而且会频繁操作数据库. 针对数据量很少的可以使用for循环插入,但是针对于数据量大的则不推荐使用for循环插入,推 ...