MongoDB:活动连接正在累积,该怎么办?

时间:2018-11-08 19:31:09

标签: node.js mongodb mongoose

我有一个站点,该站点在NodeJS,基本MongoDB,Mongoose插件上实现。最近,该网站每天大约下降一次。我最近发现这是由于内存不足,这是由于活动连接正在累积(db.serverStatus (). Connections.current)所致。也许这无关紧要,但是我在NodeJS上有一个脚本,该脚本由Crown每分钟执行一次。它检查文档中是否存在带有当前日期的帖子。但是我在那儿关闭了猫鼬的连接,我不知道可能是什么问题。其实这个文件内容:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;

const { new_time } = require("lib/functions");
const push = require("lib/push");

const apiCallback  = require("middleware/socket/apiCallback");

const mongoose = require("lib/mongoose");

const User = require("models/User");
const Post = require("models/Post");

(async () => {
    let currentPost = await Post.findCurrent(1);

    if (currentPost) {
        await currentPost.setPublished(1);

        await apiCallback.call({
            roomName: "index",
            event   : "posts.new",
            data    : {
                post: {
                    id: currentPost._id.toString()
                }
            }
        });
        await push.sendAll({
            // unnecessary data
        });
    }

    await mongoose.connection.close();

    process.exit(0);
})();

app.js:

const path           = require("path");
const express        = require("express");
const app            = express();
const bodyParser     = require("body-parser");
const cookieParser   = require("cookie-parser");
const expressSession = require("express-session");
const MongoStore     = require("connect-mongo")(expressSession);
const conf           = require("conf");
const mongoose       = require("lib/mongoose");

const expressSessionConfig = conf.get("session");

expressSessionConfig.cookie.expires = new Date(new Date().getTime() + 60 * 60 * 24 * 30 * 1000);
expressSessionConfig.store = new MongoStore({
    mongooseConnection: mongoose.connection
});

const templateDir = path.join(__dirname, conf.get("template_dir"));

app.engine("ejs", require("ejs-locals"));
app.set("views", templateDir);
app.set("view engine", "ejs")

app.use(express.static("frontend"));
app.use(cookieParser());
app.use(expressSession(expressSessionConfig));
app.use(bodyParser.urlencoded({
    extended: true
}));

require("routes")(app);

app.listen(conf.get("app_port"));

app.io.js(socket.io上的套接字服务器):

const fs   = require("fs");
const path = require("path");
const app  = require("express")();
const bodyParser  = require("body-parser");
const apiCallback = require("middleware/socket/apiCallback");
const conf = require("conf");

const sslPath    = conf.get("sslPath");
const sslOptions = {
  key : fs.readFileSync(path.join(sslPath, "key.key")),
  cert: fs.readFileSync(path.join(sslPath, "crt.crt"))
};

const server = require("https").Server(sslOptions, app);
const io     = require("socket.io")(server);

app.use(bodyParser.urlencoded({
    extended: true
}));

app.use(conf.get("api_callback:path"), apiCallback.watch(io));

require("routes/socket")(io);

server.listen(conf.get("socket_port"));

routes / socket.js:

const { in_array } = require("lib/functions");
const loadUser     = require("middleware/socket/loadUser");

const User = require("models/User");

module.exports = io => {
    io.on("connection", async socket => {
        let query   = socket.handshake.query || {};
        let { ssid } = query;

        ssid = ssid || "";

        let user        = socket.user = await loadUser(ssid);
        let oldPageName = null;

        User.setOnline(user._id, 1);

        socket.on("setPageName", pageName => {
            if (oldPageName) socket.leave(oldPageName);

            oldPageName = pageName;
            socket.join(pageName);
        });
        socket.on("disconnect", () => {
            socket.leave(oldPageName);

            User.setOnline(user._id, 0);
        });
    });
};

告诉我如何正确关闭连接,以使它们不保留在内存中,并且不会以导致杀死MongoDB守护程序进程的程度加载服务器?

1 个答案:

答案 0 :(得分:0)

您的代码没有问题,您应该进行连接池。您的问题会自动解决。每当任何api需要数据库连接时,您都会拥有一个连接池。连接将从池中拾取,并且在完成db操作之后,连接不会被破坏,而是将其返回到池中,这样,您的产品性能将得到提高,并可以解决此问题。

https://mongoosejs.com/docs/connections.html