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)
}
}));
在使用 session-mongodb
存储 session 时,可能会遇到多个 MongoDB 连接的问题。默认情况下,每次请求可能会创建新的连接,而不是复用现有的连接。这会导致过多的连接数,从而影响性能。
为了解决这个问题,可以采取以下措施:
- 确保只有一个连接:通过配置 MongoDB 客户端来确保只有一个连接。
- 使用连接池: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');
});
解释
-
MongoDB 连接:
mongoose.connect('mongodb://localhost/your_database_name', { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, });
使用
mongoose.connect
来连接 MongoDB。useNewUrlParser
,useUnifiedTopology
, 和useCreateIndex
是为了确保兼容性和安全性。 -
Session 存储配置:
const sessionStore = new MongoStore({ url: 'mongodb://localhost/your_database_name', autoRemove: 'interval', autoRemoveInterval: 10, });
使用
MongoStore
创建一个 session 存储实例,并设置自动清理过期 session 的选项。 -
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');
});
解释
-
单个 MongoDB 连接:
- 使用
mongodb
模块直接连接到 MongoDB,并将客户端保存在一个全局变量mongoClient
中。
- 使用
-
会话存储:
- 在配置
session-mongodb
时,传入client
选项以复用这个单一的 MongoDB 连接。 touchAfter
用于控制会话的更新频率,避免频繁更新会话数据。
- 在配置
这样可以确保每次请求时不会创建新的连接,从而减少连接数。希望这段代码能解决你的问题。