sqlite3 + node:何时关闭数据库?

Zol*_*tók 7 sqlite node-sqlite3 better-sqlite3

我在 上使用better-sqlite3Node,但我怀疑我的问题也适用于node-sqlite3

我基本上有两个与服务器渲染网站相关的简单问题:

  • 我需要显式调用.close()数据库吗?我似乎记得在某处读过,当当前范围(如当前函数)退出时它会自动关闭。如果我从未.close()在 Web 服务器场景中调用并接受大量请求怎么办?

  • 如果您有一堆不同的组件(身份验证、授权、本地化、支付等),并且每个组件可能需要也可能不需要在请求的整个生命周期中访问数据库(这些组件的生命周期非常短暂,除了付款),是不是更好

    1. 在服务器的生命周期内拥有一个数据库连接并将其传递
    2. 在请求的生命周期内有一个数据库连接并将其传递
    3. 每次我需要某些东西时打开一个新连接,每个请求可能打开 2-3 次(并在函数返回时显式或隐式关闭它,如果有的话)

谢谢

Zol*_*tók 4

Joshua Wise(better-sqlite3的创建者)在 GitHub 上的回答:


数据库连接在垃圾回收时会自动关闭,这是不确定的。如果您想知道连接是否已关闭(而不是猜测),您应该调用 .close()。

您只需为整个线程(如果不使用工作线程,则为整个进程)打开一个数据库连接,并在每个请求之间共享该连接。Node.js 是单线程的,因此即使同时处理多个请求,您也不必担心同时访问的问题。需要注意的是,您永远不应该在事件循环的多个时间点上打开 SQLite 事务(即,不要在 BEGIN 和 COMMIT 之间使用等待),因为这样其他请求可能会意外地将 SQL 注入到您的事务中。另外,SQLite 事务是序列化的(一次不能有多个事务),因此您应该尽快打开和关闭它们;在事件循环的滴答声中保持它们打开对性能不利。