Node.js服务器中数据库连接状态及连接复用方案咨询
长期运行Node.js服务器中SQLite连接的最佳实践
核心结论
在Fastify这类长期运行的REST服务器中,绝对不应该在每次请求时新建并关闭SQLite连接,正确的做法是在Node启动时创建一个全局数据库实例,整个服务器生命周期复用这个连接。
为什么不能每次请求新建连接?
- SQLite是文件型数据库,每次新建连接都要打开文件、建立锁机制,频繁的打开/关闭会带来严重的性能开销,尤其是请求量较大时,会显著拖慢响应速度。
- 频繁创建连接还可能引发文件锁冲突,导致请求阻塞或报错。
Fastify中的正确实现方式
在Fastify启动时初始化数据库连接,将实例挂载到Fastify的全局上下文,让所有请求都能复用这个实例:
import Fastify from 'fastify'; import Database from 'better-sqlite3'; const fastify = Fastify({ logger: true }); // 启动时创建数据库连接 const db = new Database('./path/to/db.sqlite'); // 将数据库实例挂载到Fastify全局 fastify.decorate('db', db); // 示例路由,复用全局连接 fastify.get('/data', async (request, reply) => { const result = fastify.db.prepare('SELECT * FROM table').all(); return result; }); // 服务器关闭时关闭数据库连接 fastify.addHook('onClose', async (instance) => { instance.db.close(); }); // 启动服务器 const start = async () => { try { await fastify.listen({ port: 3000 }); } catch (err) { fastify.log.error(err); process.exit(1); } }; start();
关键注意点
- 复用单个连接是SQLite在Node.js长期服务中的标准做法,better-sqlite3本身基于单线程设计,复用实例不会有线程安全问题(Node.js事件循环为单线程模型)。
- 必须在服务器关闭时(比如收到终止信号)手动关闭数据库连接,避免文件句柄泄漏。
内容的提问来源于stack exchange,提问作者punkish
相关产品推荐
相关产品推荐

