使用 SQLite3 + Node.js 的最佳实践

     2023-03-22     241

关键词:

【中文标题】使用 SQLite3 + Node.js 的最佳实践【英文标题】:Best practices for using SQLite3 + Node.js 【发布时间】:2013-09-24 20:12:11 【问题描述】:

我有一个适度的 Node.js 脚本,它通过 API 从 Wikipedia 中提取数据并将其存储在 SQLite 数据库中。我正在使用这个node-sqlite3 模块。

在某些情况下,我会提取超过 600,000 篇文章的数据,并将关于每篇文章的一些元数据连续存储在数据库中。从 API 中以 500 篇为一组检索文章。

使用 500 篇文章的数据检索 JSON 对象的请求将对象传递给此回调:

// (db already instantiated as 'new sqlite.Database("wikipedia.sqlite");')

function callback(articles) 
    articles.forEach(function (article) 
        db.run(
            "INSERT OR IGNORE INTO articles (name, id, created) VALUES (?,?,?)", 
            [
                article["title"], 
                article["pageid"], 
                article["timestamp"]
            ]
        );
    );

这些模块默认并行运行,但 node-sqlite3 的文档包含一个串行操作示例,如下所示:

db.serialize(function () 
    db.run("CREATE TABLE lorem (info TEXT)");

    var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
    for (var i = 0; i < 10; i++) 
        stmt.run("Ipsum " + i);
    
    stmt.finalize();

我试图模仿这一点,但几乎没有发现性能差异。我做错了吗?现在,从 API 中检索数据的速度比写入数据库的速度快得多,尽管速度还不算慢。但是用 600K 个单独的 INSERT 命令来攻击数据库感觉很笨拙。

更新: 根据接受的答案,这似乎适用于 node-sqlite3,而不是原生解决方案。 (见Issue)。

db.run("BEGIN TRANSACTION");
function callback(articles) 
    articles.forEach(function (article) 
        db.run(
            "INSERT OR IGNORE INTO articles (name, id, created) VALUES (?,?,?)",
            [
                article["title"],
                article["pageid"],
                article["timestamp"]
            ]
        );
    );

db.run("END");

【问题讨论】:

+1 表示“开始交易”的想法。您可以根据数据库大小来提高速度的其他方法是安装 ram 驱动器并从那里运行数据库。在 Windows 上,我过去使用过 OSFMunt,效果非常好。 抱歉,您能否解释一下更新部分,因为我不明白。你为什么要在调用 db.run 之间声明一个函数?有错吗? 【参考方案1】:

当您对 SQLite 数据库进行多次插入时,您需要将插入的集合包装到事务中。否则,SQLite 将等待磁盘盘片在每次插入时完全旋转,同时对您插入的每条记录进行读写验证。

在 7200 RPM 时,磁盘盘片再次旋转大约需要 1/60 秒,这是计算机时间的永恒。

【讨论】:

这是一个有趣的视角。无论平台(例如电话、服务器)如​​何,SQLite 都是这样工作的吗?即使插入的集合不相互依赖,仍然需要一个事务来减少总插入时间? @Joyce:事务推迟写后读验证,直到所有插入完成。这就是它加快速度的方式;您不必在每次插入后等待盘片旋转。插入是否相互关联并不重要。

使用 node.js 检查数据是不是包含在 SQLite3 数据库中

】使用node.js检查数据是不是包含在SQLite3数据库中【英文标题】:CheckifdataisincludedinSQLite3databasewithnode.js使用node.js检查数据是否包含在SQLite3数据库中【发布时间】:2018-07-0602:32:33【问题描述】:所以我想用node.js检查我的数据库中... 查看详情

使用 Node.js 构建网站的最佳实践

】使用Node.js构建网站的最佳实践【英文标题】:BestpracticesofbuildingawebsiteusingNode.js【发布时间】:2012-07-0322:18:55【问题描述】:我想知道如何使用Node.js从头开始​​开发网站。我了解我如何可能做到这一点,但我对最佳设计实践... 查看详情

使用 Node.js 构建网站的最佳实践

】使用Node.js构建网站的最佳实践【英文标题】:BestpracticesofbuildingawebsiteusingNode.js【发布时间】:2012-07-0322:18:55【问题描述】:我想知道如何使用Node.js从头开始​​开发网站。我了解我如何可能做到这一点,但我对最佳设计实践... 查看详情

使用 Mongoose + Node.js 的最佳异步/等待方法是啥?

】使用Mongoose+Node.js的最佳异步/等待方法是啥?【英文标题】:What\'sthebestAsync/AwaitapproachusingMongoose+Node.js?使用Mongoose+Node.js的最佳异步/等待方法是什么?【发布时间】:2020-10-1619:45:18【问题描述】:我想知道这种使用猫鼬的异步/... 查看详情

与 Node.js 一起使用的最佳测试框架是啥? [关闭]

】与Node.js一起使用的最佳测试框架是啥?[关闭]【英文标题】:WhatisthebesttestingframeworktousewithNode.js?[closed]与Node.js一起使用的最佳测试框架是什么?[关闭]【发布时间】:2011-05-1713:33:36【问题描述】:我在https://github.com/ry/node/wiki/m... 查看详情

在 node.js 中安装 sqlite3 时出错

】在node.js中安装sqlite3时出错【英文标题】:Errorinstallingsqlite3innode.js【发布时间】:2017-03-2013:49:07【问题描述】:我在node.js中安装包时遇到问题。我的npm版本是2.14.3,我需要安装sqlite3包。在我的项目路径中,我使用了这个命令... 查看详情

markdownrest-api使用node.js和sqlite3(代码片段)

查看详情

使用 Node.js 连接到 MongoDB 的最佳方式 [重复]

】使用Node.js连接到MongoDB的最佳方式[重复]【英文标题】:BestwaytoconnecttoMongoDBusingNode.js[duplicate]【发布时间】:2016-11-2322:40:40【问题描述】:我已经阅读了一些关于如何将Mongo与Node一起使用的指南,它们似乎都以不同的方式连接... 查看详情

在 node.js 中使用 fs 覆盖文件的最佳方法是啥

】在node.js中使用fs覆盖文件的最佳方法是啥【英文标题】:What\'sthebestwaytooverwriteafileusingfsinnode.js在node.js中使用fs覆盖文件的最佳方法是什么【发布时间】:2017-10-0902:27:46【问题描述】:我正在尝试覆盖现有文件。我首先使用以... 查看详情

使用 express.js 在 node.js 中提供 html 的最佳实践是啥?

】使用express.js在node.js中提供html的最佳实践是啥?【英文标题】:Whatisthebestpracticeforservinghtmlinnode.jswithexpress.js?使用express.js在node.js中提供html的最佳实践是什么?【发布时间】:2013-05-1117:10:06【问题描述】:我目前正在我的app.js/... 查看详情

如何使用node js同步读取sqlite3数据库?

】如何使用nodejs同步读取sqlite3数据库?【英文标题】:Howtoreadasqlite3database,usingnodejs,synchronously?【发布时间】:2013-03-1215:19:29【问题描述】:exports.allProbes=function()varrows=db.all("SELECT*FROMprobes;");returnrows;;main:varjson_values=allPro 查看详情

使用 Express.js 在 Node.js 中设置路由的最佳方式

】使用Express.js在Node.js中设置路由的最佳方式【英文标题】:BestwaytosetuproutesinNode.jswithExpress.js【发布时间】:2012-08-0102:50:20【问题描述】:我想知道如何在Express.js中构建我的路线。这是我现在的应用程序目录:├──public│  ... 查看详情

Node.js 上 MongoDB 连接的最佳实践是啥?

...:02:48【问题描述】:这对我来说有点不清楚(我刚刚开始使用Node和Mongo),并且由于服务器性能和压力(我想这是另一个问题,但我会得到到文章末尾)。所以,假设我正在使用N 查看详情

讨论:使用 node.js / socket.io 实现聊天室的最佳方式?

】讨论:使用node.js/socket.io实现聊天室的最佳方式?【英文标题】:Discussion:Bestwaytoimplementachatroomwithnode.js/socket.io?【发布时间】:2011-11-2018:49:48【问题描述】:我说的不是一般的聊天应用程序,而是专门讨论聊天室的实现。所以... 查看详情

10+最佳的node.js教程和实例

...s呢?Node.js是迄今运用最多的服务端JavaScript运行时环境,使用JavaScrip 查看详情

Node.js 说它不能加载 sqlite3 模块,但无论如何

】Node.js说它不能加载sqlite3模块,但无论如何【英文标题】:Node.jssaysitcan\'tloadsqlite3module,butdoesanyway【发布时间】:2013-12-1121:01:55【问题描述】:我正在使用新的Node.jsToolsforVisualStudio并包含sqlite3npmmodule。当我调用require(\'sqlite3\')... 查看详情

使用 JWT (Node.js + mongoose) 在 REST API 中管理用户权限的最佳方法

】使用JWT(Node.js+mongoose)在RESTAPI中管理用户权限的最佳方法【英文标题】:BestwaytomanageuserpermissionsinaRESTAPIusingJWT(Node.js+mongoose)【发布时间】:2019-06-2713:25:48【问题描述】:我是mongoose和mongoDB的新手,我想知道避免用户在登录后修... 查看详情

node.js 的最佳 Facebook 连接库是啥?

...【发布时间】:2011-05-2722:56:55【问题描述】:我见过多种使用node.js和facebookconnect的工具。然而,其中许多似乎不完整、过于复杂(非抽象)或不再更新/维护。我找到了这三个项目:https://gi 查看详情