3

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

我基本上有 2 个简单的问题,与服务器呈现的网站有关:

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

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

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

谢谢

4

1 回答 1

0

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


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

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

于 2021-04-03T18:39:27.277 回答