sqlite3 + 节点:什么时候关闭数据库?
sqlite3 + node: when to close db?
我也在用 better-sqlite3 on Node
, but I suspect my questions are applicable to node-sqlite3。
我基本上有 2 个简单的问题,与服务器呈现的网站有关:
我需要在数据库上显式调用 .close()
吗?我似乎记得在某处读到它会在当前作用域(如当前函数)退出时自动关闭。如果我从不在 Web 服务器场景中调用 .close()
,接受大量请求怎么办?
如果您有一堆不同的组件(身份验证、授权、本地化、支付等...),并且每个组件在请求的整个生命周期中可能需要也可能不需要访问数据库(都是很短暂的,除了payment),是不是比较好
- 在 服务器 的生命周期内有一个数据库连接,并将其传递给
- 在 请求 的生命周期内有一个数据库连接,并将其传递给
- 每次我需要某些东西时打开一个新连接,每个请求可能 2-3 次(并在函数 returns 时显式或隐式关闭它,如果是的话)
谢谢
Joshua Wise(better-sqlite3
的创作者)answer 在 GitHub 上:
数据库连接在垃圾回收时自动关闭,这是不确定的。如果您想知道连接已关闭(而不是猜测),您应该调用 .close()。
您可以只为整个线程(如果您不使用工作线程,则为整个进程)打开一个数据库连接,并在每个请求之间共享该连接。 Node.js 是单线程的,因此您不必担心同时访问,即使同时处理多个请求。一个警告是你永远不应该在事件循环的多个滴答中打开一个 SQLite 事务(即,不要在 BEGIN 和 COMMIT 之间使用 await),因为其他请求可能会意外注入 SQL 进入您的交易。此外,SQLite 交易是序列化的(一次不能超过一个),因此您应该尽快打开和关闭它们;让它们在事件循环的滴答声中保持打开状态对性能不利。
我也在用 better-sqlite3 on Node
, but I suspect my questions are applicable to node-sqlite3。
我基本上有 2 个简单的问题,与服务器呈现的网站有关:
我需要在数据库上显式调用
.close()
吗?我似乎记得在某处读到它会在当前作用域(如当前函数)退出时自动关闭。如果我从不在 Web 服务器场景中调用.close()
,接受大量请求怎么办?如果您有一堆不同的组件(身份验证、授权、本地化、支付等...),并且每个组件在请求的整个生命周期中可能需要也可能不需要访问数据库(都是很短暂的,除了payment),是不是比较好
- 在 服务器 的生命周期内有一个数据库连接,并将其传递给
- 在 请求 的生命周期内有一个数据库连接,并将其传递给
- 每次我需要某些东西时打开一个新连接,每个请求可能 2-3 次(并在函数 returns 时显式或隐式关闭它,如果是的话)
谢谢
Joshua Wise(better-sqlite3
的创作者)answer 在 GitHub 上:
数据库连接在垃圾回收时自动关闭,这是不确定的。如果您想知道连接已关闭(而不是猜测),您应该调用 .close()。
您可以只为整个线程(如果您不使用工作线程,则为整个进程)打开一个数据库连接,并在每个请求之间共享该连接。 Node.js 是单线程的,因此您不必担心同时访问,即使同时处理多个请求。一个警告是你永远不应该在事件循环的多个滴答中打开一个 SQLite 事务(即,不要在 BEGIN 和 COMMIT 之间使用 await),因为其他请求可能会意外注入 SQL 进入您的交易。此外,SQLite 交易是序列化的(一次不能超过一个),因此您应该尽快打开和关闭它们;让它们在事件循环的滴答声中保持打开状态对性能不利。