我在MongoDB中使用node-mongodb-native驱动程序来编写网站。
我对如何管理连接有一些疑问:
仅使用一个MongoDB连接就可以处理所有请求是否足够?有性能问题吗?如果没有,是否可以设置全局连接以在整个应用程序中使用?
如果不是,请问在请求到达时打开一个新连接,并在处理请求时将其关闭,这会很好吗?打开和关闭连接是否昂贵?
我应该使用全局连接池吗?我听说驱动程序具有本地连接池。这是一个好选择吗?
如果使用连接池,应使用多少个连接?
还有其他我应该注意的事情吗?
我在MongoDB中使用node-mongodb-native驱动程序来编写网站。
我对如何管理连接有一些疑问:
仅使用一个MongoDB连接就可以处理所有请求是否足够?有性能问题吗?如果没有,是否可以设置全局连接以在整个应用程序中使用?
如果不是,请问在请求到达时打开一个新连接,并在处理请求时将其关闭,这会很好吗?打开和关闭连接是否昂贵?
我应该使用全局连接池吗?我听说驱动程序具有本地连接池。这是一个好选择吗?
如果使用连接池,应使用多少个连接?
还有其他我应该注意的事情吗?
您应该将连接创建为服务,然后在需要时重用它。
// db.service.js
import { MongoClient } from "mongodb";
import database from "../config/database";
const dbService = {
db: undefined,
connect: callback => {
MongoClient.connect(database.uri, function(err, data) {
if (err) {
MongoClient.close();
callback(err);
}
dbService.db = data;
console.log("Connected to database");
callback(null);
});
}
};
export default dbService;
我的App.js示例
// App Start
dbService.connect(err => {
if (err) {
console.log("Error: ", err);
process.exit(1);
}
server.listen(config.port, () => {
console.log(`Api runnning at ${config.port}`);
});
});
并在任何需要的地方使用
import dbService from "db.service.js"
const db = dbService.db
我一直在我的应用程序中使用带有Redis连接的通用池-我强烈推荐它。它是通用的,我当然知道它可以与mysql一起使用,所以我认为您和mongo不会遇到任何问题
如果您拥有Express.js,则可以使用express-mongo-db在没有池的情况下在请求之间缓存和共享MongoDB连接(因为接受的答案说这是共享连接的正确方法)。
如果不是,您可以查看其源代码并在另一个框架中使用它。
您的应用程序启动并重新使用db对象时,只需打开一次do MongoClient.connect。每个.connect都不是一个单例连接池。
因此,要直接回答您的问题,请重复使用产生的db对象MongoClient.connect()
。与每个数据库操作上的打开/关闭连接相比,这可以为您提供缓冲,并可以显着提高速度。
http://mongoosejs.com/docs/api.html
查看猫鼬的来源。他们打开一个连接并将其绑定到Model对象,因此当需要Model Object时,将与数据库建立连接。驱动程序负责连接池。