gpt4 book ai didi

javascript - 如何用Node.js异步查询大量数据?

转载 作者:行者123 更新时间:2023-11-29 19:41:51 24 4
gpt4 key购买 nike

我正在尝试从 mysql 数据库中查询 40 万行,每次获取 10 行。要异步执行此操作,我需要使用如下递归:

var migrate = function(offset, size) {
Mysql.query(query, [offset, size], function(err, rows) {
if (!err && rows.length) {
setTimeout(function() {
// Pretend doing something and get next batch.
migrate(offset + size, size);
}, 1000);
}
});
};

migrate(0, 10);

问题是,第一次调用 migrate() 会创建自己的子回调,并且所有这些回调都会保留在内存中,直到最后一次 migrate() 调用完成了。

想到的唯一解决方案是在 while 循环内同步运行它。

您能告诉我如何正确地做到这一点吗?谢谢。

最佳答案

在当前示例中 mysql模块可以通过查询所有记录而不分块并使用 Streaming query rows 来完成。一旦处理结果,它将逐一运行查询。

Mysql.query(sql).on('result', function(row) {
Mysql.pause();
setTimeout(function() {
// Pretend doing something.
Mysql.resume();
}, 1000);
});

但是(!),result回调不应该有任何闭包变量,因为在这种情况下这些变量将保留在内存中。我做了一些基准测试,这就是我所知道的,否则无法解释。

一般来说,如果你需要处理大量数据,无论是mysql还是其他什么,我都会推荐:

  1. 使用streams .
  2. 使用process.nextTick() .
  3. 不要使用闭包。
  4. 不要使用递归。

关于javascript - 如何用Node.js异步查询大量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41301588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com