如何优雅地关闭猫鼬的连接池?

Posted

技术标签:

【中文标题】如何优雅地关闭猫鼬的连接池?【英文标题】:How do I gracefully shutdown mongoose's connection pool? 【发布时间】:2019-06-27 01:38:21 【问题描述】:

如果我收到 SIGINT/SIGTERM(例如 ctrl+c),那么我必须优雅地停止我的应用程序并关闭与 mongodb 服务器的所有连接。

大多数文档/教程都声明要停止连接(或 连接池),我必须使用mongoose.disconnect() - 它在池中的连接上调用.close()

然而,所有这些文档也都说应该在所有待处理的写入完成后完成

当我收到信号事件(例如 SIGINT、SIGTERM 等)时,我如何知道这一点? mongoose 有正常关机功能吗,还是打电话disconnect() 会丢失数据?

(我正在使用最新的位。)

【问题讨论】:

我知道如何监听信号事件。我不知道如何确保所有写入都被刷新。如果可能的话,如何优雅地做到这一点。 【参考方案1】:

要接收 SIGINT 信号并停止连接,您可以使用以下代码:

process.on('SIGINT', () => 
    mongoose.disconnect().then(() => 
        process.exit();
    );
);

【讨论】:

我知道该怎么做。问题是我如何优雅地这样做 - 如果可能的话 - 以便不会丢失挂起的写入。 它不会强制关闭连接。 process.exit() 是一种快速失败的方法 但是会在mongoose.disconnect() return RESOLVED promise之后调用...

以上是关于如何优雅地关闭猫鼬的连接池?的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅地关闭线程池?从源码剖析线程池的正确销毁姿势。

如果优雅地关闭ExecutorService提供的java线程池

猫鼬关闭连接

带有猫鼬的 GraphQL

带有打字稿的猫鼬,来自猫鼬的错误“连接”

优雅代码08-构建自己的连接池