我现在的策略是在路由器级别建立数据库连接,因此每条路由都有自己的连接.我的一条路线的代码如下所示:
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('/',next) { res.render('lists/index'); var coll = db.collection('lists'); coll.find().each(function(err,obj) { console.log(obj); }); next(); }); router.get('/new',next) { res.render('lists/new'); next(); }); router.all('*',next) { console.log('Closing database'); //db.close(); }); module.exports = router;
我正在测试这个视图如何与我的数据库交互,两个router.all函数包装我的http请求.在我看来,每当请求此路由器中的页面时,服务器应该连接到数据库,允许相应的http请求函数访问数据库(在这种情况下只是将其内容打印到控制台),然后在那时关闭它一旦http请求完成.然而,这种情况并非如此.正如你所看到的,我已经注释掉了db.close函数,因为它抛出了一个错误,上面写着“一旦发送它们就无法设置标题”.我认为这意味着我不太了解Express路由“管道”,事情也没有按照我期望的顺序执行.
我应该使用不同的路由器方法吗?也许router.use?或者我是以错误的方式接近这个,我应该将数据库连接放在其他地方吗?
我正在使用this作为参考,在池化方面有什么好的做法,但它们似乎没有关闭连接?如果我不关闭连接,我只看到我的mongodb连接数量上升,我认为这不是一件好事.只是你必须在连接的数量和长度之间找到平衡点吗?
解决方法
现在,您正在做的是在每个请求上重新连接到数据库,即使是那些根本不使用数据库的请求.此外,您甚至在等待连接建立之前调用next().
数据库连接是持久的 – 而不是一次性的事情,所以你的方法可能会导致性能很差,我甚至不确定你为什么要这样做.单个连接有什么问题吗?我不认为像这样锤击你的数据库会有所帮助.如果有的话,它只会让事情变得更糟.
当您使用本机连接到Mongo时
MongoDB Node.js Driver您可以使用一些选项,例如:
> poolSize – 为每个服务器或代理连接设置最大poolSize(默认值为5)
> autoReconnect – 出错时重新连接(默认为true)
其他一些有趣的选项是:reconnectTries,reconnectInterval,keepAlive,connectTimeoutMS,socketTimeoutMS.
如果您对默认值不满意,可以更改这些选项的值.
有关详情,请参阅:
> Connection Failures and Retries
> MongoClient or how to connect in a new and better way
> Tutorials / Connect to MongoDB
> Reference / Connection Options / Connection Settings
> Question about node.js mongo driver auto-reconnect(邮件列表)