Nodejs mongodb 链接数的问题

Nodejs mongodb 链接数的问题

使用 session-mongodb 存储session 时,默认会产生5条数据库链接

Mon Jul 01 15:43:50.377 [initandlisten] connection accepted from 127.0.0.1:37821
 #1 (1 connection now open)
Mon Jul 01 15:43:50.385 [initandlisten] connection accepted from 127.0.0.1:37822
 #2 (2 connections now open)
Mon Jul 01 15:43:50.385 [initandlisten] connection accepted from 127.0.0.1:37823
 #3 (3 connections now open)
Mon Jul 01 15:43:50.385 [initandlisten] connection accepted from 127.0.0.1:37824
 #4 (4 connections now open)
Mon Jul 01 15:43:50.393 [initandlisten] connection accepted from 127.0.0.1:37825
 #5 (5 connections now open)
Mon Jul 01 15:44:05.612 [initandlisten] connection accepted from 127.0.0.1:37828
 #6 (6 connections now open)
Mon Jul 01 15:44:05.627 [conn6] end connection 127.0.0.1:37828 (5 connections no
w open)

其实应该是一条链接的,应该怎么做啊

app.js配置

var MongoStore = require('session-mongoose')(express);
var settings = require('./Settings');
var sessionStore = new MongoStore({
  db:settings.db
},function(){
  console.log('connect mongodb success...');
});
app.use(express.session({
    secret:settings.db,
    store:sessionStore,
    cookie:{
      maxAge:new Date(Date.now()+1000*60*60)
    }
}));

5 回复

在使用 session-mongodb 存储 session 时,可能会遇到多个 MongoDB 连接的问题。默认情况下,每次请求可能会创建新的连接,而不是复用现有的连接。这会导致过多的连接数,从而影响性能。

为了解决这个问题,可以采取以下措施:

  1. 确保只有一个连接:通过配置 MongoDB 客户端来确保只有一个连接。
  2. 使用连接池:MongoDB 驱动程序支持连接池,这样可以在多个请求之间复用连接。

以下是改进后的 app.js 配置示例:

const express = require('express');
const MongoStore = require('session-mongoose')(express);
const mongoose = require('mongoose');

// 连接 MongoDB
mongoose.connect('mongodb://localhost/your_database_name', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useCreateIndex: true,
});

const app = express();

// 设置 session 存储
const sessionStore = new MongoStore({
  url: 'mongodb://localhost/your_database_name',
  autoRemove: 'interval', // 自动清理过期的 session
  autoRemoveInterval: 10, // 清理间隔(分钟)
});

app.use(express.session({
  secret: 'your_secret_key',
  store: sessionStore,
  cookie: {
    maxAge: 1000 * 60 * 60, // session 的最大存活时间(毫秒)
  },
}));

// 路由和其他中间件
app.get('/', (req, res) => {
  req.session.views = (req.session.views || 0) + 1;
  res.send(`You visited this page ${req.session.views} times`);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

解释

  1. MongoDB 连接

    mongoose.connect('mongodb://localhost/your_database_name', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useCreateIndex: true,
    });
    

    使用 mongoose.connect 来连接 MongoDB。useNewUrlParser, useUnifiedTopology, 和 useCreateIndex 是为了确保兼容性和安全性。

  2. Session 存储配置

    const sessionStore = new MongoStore({
      url: 'mongodb://localhost/your_database_name',
      autoRemove: 'interval',
      autoRemoveInterval: 10,
    });
    

    使用 MongoStore 创建一个 session 存储实例,并设置自动清理过期 session 的选项。

  3. Express Session 中间件

    app.use(express.session({
      secret: 'your_secret_key',
      store: sessionStore,
      cookie: {
        maxAge: 1000 * 60 * 60,
      },
    }));
    

    使用 express.session 中间件,并指定 session 存储、secret 密钥和 cookie 设置。

通过这些配置,你可以确保每个请求只使用一个持久的 MongoDB 连接,避免了不必要的连接开销。


看文档,创建MongoStore是有参数的,搞不清楚你要设成1干什么?这里5个连接还是小了点

1、那按照您的意思,五个链接应该属正常的了? 2、你所说的参数是指这个吗?

var sessionStore = new MongoStore({
    url: "mongodb://localhost/session",
    interval: 120000 // expiration check worker run interval in millisec (default: 60000)
});

3、你说的我设成1 是指哪里?没搞明白。 4、谢谢你的指导。

mongodb://localhost/session?poolSize=5,如果不指定默认是5,可以设大一点

在 Node.js 中使用 session-mongodb 存储 session 时,默认情况下可能会创建多个数据库连接。这通常是因为每次请求时都创建了一个新的连接,而不是复用同一个连接。

为了解决这个问题,你可以通过调整 session-mongodb 的配置来确保只使用一个连接。以下是一个修改后的示例代码:

const express = require('express');
const MongoStore = require('session-mongoose')(express);
const app = express();

const settings = {
  db: 'mongodb://localhost/yourdb'
};

// 创建一个单一的 MongoDB 连接实例
let mongoClient;
require('mongodb').MongoClient.connect(settings.db, (err, client) => {
  if (err) throw err;
  mongoClient = client;
  console.log('Connected to MongoDB successfully');
});

app.use(express.session({
  secret: settings.db,
  store: new MongoStore({
    client: mongoClient,
    touchAfter: 24 * 3600 // 控制会话更新频率
  }),
  cookie: {
    maxAge: 1000 * 60 * 60
  }
}));

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

解释

  1. 单个 MongoDB 连接

    • 使用 mongodb 模块直接连接到 MongoDB,并将客户端保存在一个全局变量 mongoClient 中。
  2. 会话存储

    • 在配置 session-mongodb 时,传入 client 选项以复用这个单一的 MongoDB 连接。
    • touchAfter 用于控制会话的更新频率,避免频繁更新会话数据。

这样可以确保每次请求时不会创建新的连接,从而减少连接数。希望这段代码能解决你的问题。

回到顶部