mongodb 连接如何处理 NodeJS express 服务器中的并发请求?

Posted

技术标签:

【中文标题】mongodb 连接如何处理 NodeJS express 服务器中的并发请求?【英文标题】:How mongodb connection works on concurrent requests in NodeJS express server? 【发布时间】:2014-06-08 07:38:27 【问题描述】:

我是 mongoDB 的新手,我目前正在使用 Node express 服务器设置它。我想知道如何管理对 mongodb 的并发请求,以使用 mongoose 驱动模块读取集合数据。

例如:

如果有 100 个用户同时访问我的服务器 (http://xxxxxx.com/showusers),express 服务器中的 mongodb 连接将如何工作?是单个连接还是拆分为 100 个连接,每个请求一个?

操作后如何有效关闭mongodb中的连接对象?或者我们可以像下面的代码那样将连接留在快递服务器中吗?

下面是我的代码..

服务器.js

var express = require('express');

var app = express();
app.set('port', config.port);



  app.get('/users',storeusersapi.showUsers);

  app.get('/storeUser',storeusersapi._insertUserDetails);

  app.get('/findUser/:email',storeusersapi._findUser);

app.listen(app.get('port'),function()
   log.info('Express app started on port ' + app.get('port'));
);

storeusersapi.js

    var mongoose = require('mongoose');
    var log = require('../config/logger');

// Mongoose connection to MongoDB (ted/ted is readonly)
mongoose.connect('mongodb://localhost/mydb', function (error) 
if (error) 
    log.error("MongoDB Connection failure - " +error);
else
    log.info('MongoDB is connected Successfully!!!');

);

// Mongoose Schema definition
var Schema = mongoose.Schema;
var UserSchema = new Schema(
first_name: String,
last_name: String,
email: String
);

// Mongoose Model definition
var User = mongoose.model('users', UserSchema);

exports.showUsers = function(req,res)
User.find(, function (err, docs) 
    res.json(docs);
);
;

exports._insertUserDetails = function(req,res)
   var object = new User(first_name:'bob',last_name:'sel',email:'sel@xxxxx.com');

object.save(function (err) 
    if (err) 
        log.error('Insertion error - '+ err);
    
    else 
        log.info("User Stored into database!!!");
    
);




;

exports._findUser = function(req,res)
User.find( email: req.params.email , function (err, docs) 
    res.json(docs);
);

;

【问题讨论】:

你有没有得到什么?? 【参考方案1】:

我已经分别回答了你的两个问题。

1. express 服务器中的 mongodb 连接将如何工作?

一旦创建到 mongodb 数据库的连接。(使用 mongoose 或任何其他框架)它将创建一个连接池。 (Mongoose 默认池大小为 5,python 中为 100) 创建的连接池由驱动程序维护,因此在需要连接到数据库时可以重复使用这些连接。

最佳做法是只为整个应用程序创建一次新连接。创建连接后,连接对象将用作单例。当您使用 mongoose 模型连接到数据库时,会从创建的连接池中分配单独的连接。

如果您要每次都创建一个新连接,那么它会导致连接流失。

2。操作后如何高效关闭mongodb中的连接对象?

我不确定这个答案是否 100%。我的建议是在 express 应用程序退出时断开连接。

var db = mongoose.connect('mongodb://localhost:27017/database');    
db.disconnect();

据我所知,您在代码中所做的事情是正确的。您只创建了一次新连接。由于连接池是用它创建的,因此您不需要创建更多连接。

请通过此链接清楚地了解连接池及其使用情况。 https://dzone.com/articles/deep-dive-connection-pooling

【讨论】:

以上是关于mongodb 连接如何处理 NodeJS express 服务器中的并发请求?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何处理 MongoDB 连接、模式?

如何处理 MVC nodejs 服务上的角色(jsonwebtoken,mongoose)

如何处理 JWT.exp 时间? [复制]

Node js - 如何处理多个异步任务

nodejs +mssql效率低怎么处理

nodejs 异步应该如何处理