Better-sqlite3 性能:修订间差异

来自泡泡学习笔记
跳到导航 跳到搜索
(创建页面,内容为“ 在SQLite3数据库中,在某些情况下同时进行读写操作可能会非常慢。由于并发性在Web应用程序中通常非常重要,建议启用[https://www.sqlite.org/wal.html WAL模式]以大大提高整体性能。 <br> <syntaxhighlight lang="js">db.pragma('journal_mode = WAL');</syntaxhighlight> <br> WAL模式有一些需要考虑的缺点: * 涉及附加数据库的事务对于每个单独的数据库是原子的,但对于所有数据…”)
 
无编辑摘要
 
第47行: 第47行:


你可以通过运行<code>db.pragma('synchronous = FULL')</code>来覆盖此设置。
你可以通过运行<code>db.pragma('synchronous = FULL')</code>来覆盖此设置。
<br>
<span id="better-sqlite3-安装问题排查"></span>
= better-sqlite3 安装问题排查 =
如果你在安装<code>better-sqlite3</code>时遇到问题,请按照以下清单进行检查:
<br>
<span id="安装最新版本的node.js"></span>
== 安装最新版本的Node.js ==
# 确保你使用的是Node.js v14.21.1或更高版本。
# 如果你使用的是Windows系统,在安装过程中,一定要选择”工具为本地模块”页面上的”自动安装必需工具”选项,并按照其余步骤操作,包括打开管理员PowerShell和安装Visual Studio以及Python。所有步骤_应该_都能顺利进行。
<br>
== 安装<code>node-gyp</code>工具链 ==
# 确保你已经全局安装了[https://github.com/nodejs/node-gyp#installation <code>node-gyp</code>]。
# 确保所有的[https://github.com/nodejs/node-gyp#on-unix <code>node-gyp</code>依赖项已经安装]。在Windows上,你可能需要进行一些手动配置[https://github.com/nodejs/node-gyp#on-windows]。使用<code>npm ls node-gyp</code>来确保你的本地包没有安装一个过时版本的<code>node-gyp</code>,而这个版本被用作全局版本。
<br>
== 项目路径中没有特殊字符 ==
# 确保你的项目路径中没有空格:<code>node-gyp</code>可能无法正确转义空格或特殊字符(如<code>%</code>或<code>$</code>)。
<br>
<span id="electron"></span>
== Electron ==
# 如果你在使用[https://github.com/electron/electron Electron],尝试运行[https://www.npmjs.com/package/electron-rebuild <code>electron-rebuild</code>]。
<br>
<span id="windows"></span>
== Windows ==
如果你仍然在Windows上遇到问题并且使用的是较旧版本的Node,请尝试以下步骤:
# 安装'''最新'''的Node 14、16、18或19。
# 安装'''最新'''的Visual Studio Community版和桌面开发C++扩展。
# 安装'''最新'''的Python。
# 运行以下命令:
<pre>npm config set msvs_version 2019
npm config set msbuild_path &quot;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuildCurrent\Bin\MSBuild.exe&quot;</pre>
<ol start="5" style="list-style-type: decimal;">
<li>删除你的<code>node_modules</code>子目录。</li>
<li>删除你的<code>$HOME/.node-gyp</code>目录。</li>
<li>运行<code>npm install</code>。</li></ol>
<br>
== 如果以上方法都无效 ==
如果这些方法都无法解决你的问题,请浏览[https://github.com/JoshuaWise/better-sqlite3/issues?q=is%3Aissue 先前的问题]或者新开一个问题[https://github.com/JoshuaWise/better-sqlite3/issues/new]。


<br>
<br>

2024年1月15日 (一) 10:15的最新版本

在SQLite3数据库中,在某些情况下同时进行读写操作可能会非常慢。由于并发性在Web应用程序中通常非常重要,建议启用WAL模式以大大提高整体性能。


db.pragma('journal_mode = WAL');


WAL模式有一些需要考虑的缺点:

  • 涉及附加数据库的事务对于每个单独的数据库是原子的,但对于所有数据库作为一个集合来说不是原子的。
  • 在极少数情况下,WAL文件可能会遇到“检查点饥饿”(见下文)。
  • 有些硬件/系统限制可能会影响一些用户,在这里列出


然而,在大多数Web应用程序中,你用这些缺点换取了极快的性能。


检查点饥饿

检查点饥饿是指SQLite3由于持续对数据库进行并发读取而无法回收WAL文件。如果发生这种情况,WAL文件将无限制地增长,导致不可接受的磁盘使用量和性能下降。


如果你不同时从多个进程或线程访问数据库,你永远不会遇到这个问题。


如果你确实同时从多个进程或线程访问数据库,只需在WAL文件变得过大时使用wal_checkpoint(RESTART)语句。

setInterval(fs.stat.bind(null, 'foobar.db-wal', (err, stat) => {
  if (err) {
    if (err.code !== 'ENOENT') throw err;
  } else if (stat.size > someUnacceptableSize) {
    db.pragma('wal_checkpoint(RESTART)');
  }
}), 5000).unref();


关于持久性的说明

这个SQLite3分发版使用了SQLITE_DEFAULT_WAL_SYNCHRONOUS=1 编译时选项,这使得处于WAL模式的数据库默认为“NORMAL”同步设置。这允许应用程序实现极高的性能,但在WAL模式下引入了轻微的持久性损失。


你可以通过运行db.pragma('synchronous = FULL')来覆盖此设置。