调用异步函数后Node.js PostgreSQL程序未终止问题咨询
程序运行后不终止的原因及解决方法
原因
你用postgres包创建的sql客户端实例默认会维持一个数据库连接池,连接池会保留活跃的数据库连接用于复用,Node.js进程因为存在未释放的资源(连接池),会一直保持运行状态,不会自动退出。
解决方法
方法一:查询完成后手动关闭连接池
在数据查询完成后调用sql.end()方法关闭整个连接池,释放所有占用的资源,进程就能正常终止:
import postgres from 'postgres' import "dotenv/config" const sql = postgres({ host: process.env.DATABASE_HOST, database: process.env.DATABASE_NAME, username: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, ssl: 'require', }) async function getInfo() { const users = await sql` select * from information_schema.tables ` // 关闭连接池,释放所有资源 await sql.end() return users } getInfo().then((data) => console.log(data))
方法二:按需配置连接池(适合脚本场景)
如果是一次性执行的脚本,可以初始化客户端时限制连接池的最大连接数为1,再配合手动关闭连接池,更贴合脚本的使用场景:
import postgres from 'postgres' import "dotenv/config" const sql = postgres({ host: process.env.DATABASE_HOST, database: process.env.DATABASE_NAME, username: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, ssl: 'require', max: 1, // 限制连接池仅保留1个连接 }) async function getInfo() { const users = await sql` select * from information_schema.tables ` await sql.end() return users } getInfo().then((data) => console.log(data))
补充说明
如果是长期运行的服务(比如API后端),不需要关闭连接池,连接池的复用机制能提升数据库操作的性能;但对于一次性执行的脚本,必须手动关闭连接池才能让Node.js进程正常终止。
内容的提问来源于stack exchange,提问作者Kanishk
相关产品推荐
相关产品推荐

