【问题标题】:Parallel SQLite queries in Node.jsNode.js 中的并行 SQLite 查询
【发布时间】:2015-01-19 22:43:16
【问题描述】:

得益于 SQLite3 包,Node.js 为 SQLite 提供了一些非常好的绑定,但不幸的是,由于 Node 运行单线程,所有查询都在同一个连接中完成。 SQLite 以串行方式运行每个连接的所有查询,这意味着在 Node 下的 SQLite 中实际上不可能进行并行查询。 更多详情请查看https://github.com/mapbox/node-sqlite3/issues/394

无论您将查询逻辑包装在 async.each/async.parallel 中,还是用于并行化/序列化数据库 IO 的任何其他帮助程序包中,这都是正确的。归根结底,要从 SQLite3 下 Node 的异步 IO 架构中受益,您将需要多个处理线程。

如何做到这一点? :)

【问题讨论】:

  • 为什么需要并行查询?你想解决什么问题?
  • 一次运行多个查询,每个查询的结果不相互依赖,使用 UNION ALL 会变得非常混乱:)

标签: javascript node.js multithreading sqlite


【解决方案1】:

您可以使用集群 api 创建子进程,在这些子进程中您可以运行不同的操作,在您的情况下是 db 查询。 https://nodejs.org/api/cluster.html

注意:您要创建多少个集群取决于您的硬件。

const cluster = require('cluster');
const db = new sqlite3.Database(':memory:')

if (cluster.isMaster) {
    console.log(`Master ${process.pid} is running`);
    cluster.fork()
        .on('exit', (worker, code, signal) => {
            console.log(`worker ${worker.process.pid} died`);
        });
    cluster.fork()
        .on('exit', (worker, code, signal) => {
            console.log(`worker ${worker.process.pid} died`);
        });

} else if (cluster.worker.id === 1){
  db.run(QUERY1);
} else {
 db.run(QUERY2);
}

【讨论】:

  • 非常酷!许多年后,这得到了答案 :) 谢谢拉维!
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多