如何解决sqlite3 + 节点:何时关闭数据库?
我在 Node
上使用 better-sqlite3,但我怀疑我的问题也适用于 node-sqlite3。
我基本上有 2 个简单的问题,与服务器呈现的网站有关:
-
我需要在数据库上显式调用
.close()
吗?我似乎记得在某处读到过当当前作用域(如当前函数)退出时它会自动关闭。如果我在 Web 服务器场景中从不调用.close()
,接受大量请求会怎样? -
如果您有一堆不同的组件(身份验证、授权、本地化、支付等),并且每个组件在请求的整个生命周期中可能需要也可能不需要访问数据库(这很短暂的,除了付款),是不是更好
- 在服务器的生命周期内建立一个数据库连接并将其传递
- 在请求的生命周期内建立一个数据库连接并将其传递
- 每次我需要一些东西时打开一个新连接,每个请求可能打开 2-3 次(并在函数返回时显式或隐式关闭它,如果有的话)
谢谢
解决方法
Joshua Wise(better-sqlite3
的创建者)answer 在 GitHub 上:
数据库连接在垃圾收集时会自动关闭,这是不确定的。如果你想知道连接是否关闭(而不是猜测),你应该调用 .close()。
您可以只为整个线程打开一个数据库连接(如果您不使用工作线程,则为整个进程),并在每个请求之间共享该连接。 Node.js 是单线程的,因此您不必担心同时访问,即使同时处理多个请求。一个警告是,您永远不应该在事件循环的多个滴答声中打开 SQLite 事务(即,不要在 BEGIN 和 COMMIT 之间使用 await),因为这样其他请求可能会意外地将 SQL 注入到您的事务中。另外,SQLite 事务是序列化的(一次不能有多个),所以你应该尽快打开和关闭它们;让它们在事件循环的滴答声中保持打开状态对性能不利。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。