我正在学习如何使用node / express和mongodb,我对池连接工作有点困惑。
我现在的策略是在路由器级别建立数据库连接,因此每条路由都有自己的连接。我的一条路线的代码如下所示:
var express = require('express');
var router = express.Router();
var config = require('../config.json');
var url = config.db.URI;
var MongoClient = require('mongodb').MongoClient
, assert = require('assert');
var db;
// Connect to database
router.all('*', function(req, res, next) {
console.log('Connecting to db');
MongoClient.connect(url, function(err, database) {
assert.equal(null, err);
db = database;
});
next();
});
// GET admin list page
router.get('/', function(req, res, next) {
res.render('lists/index');
var coll = db.collection('lists');
coll.find().each(function(err, obj) {
console.log(obj);
});
next();
});
router.get('/new', function(req, res, next) {
res.render('lists/new');
next();
});
router.all('*', function(req, res, next) {
console.log('Closing database');
//db.close();
});
module.exports = router;
我正在测试这个视图如何与我的数据库交互,两个router.all函数包含我的http请求。在我看来,每当请求这个路由器中的一个页面时,服务器应该连接到数据库,允许相应的http请求函数访问数据库(在这种情况下只是将其内容打印到控制台),然后在那时关闭它一旦http请求完成。然而,这种情况并非如此。正如您所看到的,我已经注释掉了db.close函数,因为它抛出了一个错误,说“一旦发送它们就无法设置标题”。我认为这意味着我不太了解Express路由“管道”,事情也没有按照我期望的顺序执行。
我应该使用不同的路由器方法吗?也许router.use?或者我是以错误的方式接近这个,我应该将数据库连接放在其他地方吗?
我正在使用this作为参考,对于什么是良好的实践,就池化而言,但它们似乎没有关闭连接?如果我不关闭连接,我只看到我的mongodb连接数量上升,我认为这不是一件好事。是否只需要在连接的数量和长度之间找到平衡点?
答案 0 :(得分:2)
您应该建立一次连接并在所有处理程序中使用它。
现在你正在做的是在每个请求上重新连接到数据库,即使是那些根本不使用数据库的请求。此外,你甚至在等待连接建立之前调用next()。
数据库连接是持久的 - 不是一次性的事情,所以你的方法可能会导致性能很差,我甚至不确定你为什么要那样做。单个连接有什么问题吗?我不认为像这样锤击你的数据库会有所帮助。如果有的话,它只会让事情变得更糟。
当您使用本机连接到Mongo时 MongoDB Node.js Driver您可以使用一些选项,例如:
poolSize
- 为每个服务器或代理连接设置最大poolSize(默认为5
)autoReconnect
- 重新连接错误(默认为true
)其他一些有趣的选项包括:reconnectTries
,reconnectInterval
,keepAlive
,connectTimeoutMS
,socketTimeoutMS
。
如果您对默认设置不满意,可以更改这些选项的值。
有关详细信息,请参阅: