请教大家一个问题,Nodejs中使用mongoose的时候,需要在每次操作后都关闭一次(mongoose.disconnect())吗?

请教大家一个问题,Nodejs中使用mongoose的时候,需要在每次操作后都关闭一次(mongoose.disconnect())吗?

就比如 Album.get = function get(vid, shareCb) { albums.find({"_id":vid}).exec(function(err,data) { if(err){ console.log(err); }else{ shareCb(data); mongoose.disconnect(); } }); };

6 回复

当然可以。让我们来探讨一下在 Node.js 中使用 Mongoose 进行数据库操作时是否需要每次都调用 mongoose.disconnect()

背景

Mongoose 是一个用于 MongoDB 的对象模型工具,它让处理 MongoDB 数据库变得更加简单和高效。通常情况下,我们在应用启动时会连接到 MongoDB 数据库,并且在整个应用生命周期内保持这个连接。这意味着我们不需要在每次数据库操作后都去断开连接。

示例代码

以下是一个简单的示例,展示了如何使用 Mongoose 进行数据库操作而无需在每次操作后调用 mongoose.disconnect()

const mongoose = require('mongoose');

// 连接到 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义一个 Album 模型
const AlbumSchema = new mongoose.Schema({
    title: String,
    artist: String
});

const Album = mongoose.model('Album', AlbumSchema);

// 获取专辑信息的方法
Album.get = function get(vid, shareCb) {
    Album.find({ "_id": vid }).exec(function (err, data) {
        if (err) {
            console.log(err);
        } else {
            shareCb(data);
        }
    });
};

// 使用示例
Album.get('some-id', function (data) {
    console.log(data);
});

// 注意:这里没有调用 mongoose.disconnect()

解释

  1. 连接到数据库:我们在应用启动时通过 mongoose.connect 方法连接到 MongoDB 数据库。这个连接会一直保持到应用关闭。
  2. 定义模型:我们定义了一个名为 Album 的 Mongoose 模型。
  3. 获取专辑信息:在 Album.get 方法中,我们执行了一个查询并传递了一个回调函数。这个回调函数处理查询结果或错误。
  4. 不调用 mongoose.disconnect():在完成数据库操作后,我们没有调用 mongoose.disconnect()。这是因为我们希望在整个应用生命周期内保持数据库连接。

结论

通常情况下,你不需要在每次数据库操作后都调用 mongoose.disconnect()。保持连接打开可以让后续的操作更加高效,尤其是在高并发的场景下。只有在应用即将退出或进行长时间的不活动期时,才考虑显式地调用 mongoose.disconnect() 来关闭数据库连接。


不需要,一直连着就行了

多谢了!

一直连着就好。

mongodb 默认开了个 pool size = 5 的池子,mongoose 应该也会有池子的。

好的,多谢!

在Node.js中使用Mongoose时,并不一定需要在每次数据库操作后都调用mongoose.disconnect()。实际上,频繁地连接和断开数据库连接会增加不必要的开销,尤其是在一个长时间运行的应用程序中。

通常情况下,你应该在应用程序启动时建立数据库连接,并在应用关闭时才断开连接。对于大多数应用来说,可以在启动脚本或初始化函数中执行mongoose.connect(),然后在关闭应用程序时调用mongoose.disconnect()

以下是一个简单的示例,展示了如何管理Mongoose连接:

const mongoose = require('mongoose');

async function connectDB() {
    try {
        await mongoose.connect('mongodb://localhost:27017/yourDatabaseName', {
            useNewUrlParser: true,
            useUnifiedTopology: true
        });
        console.log('Connected to MongoDB');
    } catch (error) {
        console.error('Failed to connect to MongoDB', error);
        process.exit(1); // 如果连接失败,则退出应用程序
    }
}

function disconnectDB() {
    mongoose.disconnect().then(() => {
        console.log('Disconnected from MongoDB');
    }).catch((err) => {
        console.error('Error disconnecting from MongoDB', err);
    });
}

// 在应用启动时调用connectDB
connectDB();

// 示例模型方法
Album.get = async function (vid) {
    const data = await this.model('Album').find({ "_id": vid }).exec();
    return data;
};

// 在应用关闭时调用disconnectDB
process.on('SIGINT', () => {
    disconnectDB();
    process.exit();
});

在这个示例中,connectDB 函数用于建立与MongoDB的连接,而 disconnectDB 函数则用于在应用关闭时断开连接。Album.get 方法中的数据库操作不再需要手动调用 mongoose.disconnect()

回到顶部