I used to connect to the mongodb like this.
import mongoose from "mongoose"
const connectDb = async () => {
return mongoose.connect(process.env.MONGO_URI, (err) => {
if (err) {
console.log(err);
} else {
console.log("connected to mongoDB successfully");
}
});
}
export default connectDb
but this creates a new connection on each request. then I learned about cached connection but I don’t know what is the right way to do it using mongoose. I found one video on mongodb’s official yt channel that was creating a cached connection but they did not use mongoose to do that.
I found one method but I am not sure wheather it is a correct way or not but for now it is working fine.
import mongoose from 'mongoose'
const MONGODB_URI = process.env.MONGO_URI
// If MongoDb uri is not provided we will throw an error
if (!MONGODB_URI) {
throw new Error(
'Please define the MONGODB_URI environment variable inside .env.local'
)
}
// When we first connect to the db we will cache that connection in a variable named cached so that we don't have to connect to the database again and again on each and every request.
let cached = global.mongoose
// If we don't have cached connection then first we will set conn: null, promise: null
if (!cached) {
cached = global.mongoose = { conn: null, promise: null }
}
// creating an async function to connect to the db
async function connectDb() {
// If we have cached connection then we don't have to make connection once again. we will return the old connection.
if (cached.conn) {
return cached.conn
}
// If we don't have cached connection then we will create one and return it.
if (!cached.promise) {
const opts = {
bufferCommands: false,
}
cached.promise = await mongoose.connect(MONGODB_URI, {useNewUrlParser: true}).then((mongoose) => {
return mongoose
})
}
try {
cached.conn = await cached.promise
} catch (e) {
cached.promise = null
throw e
}
return cached.conn
}
export default connectDb
2
Answers
You can Cache the DB connection
As shown above if one’s a connection is established we can store it in cacheDB variable and you can call cached connection whenever required after that.
ref from :- https://github.com/orgs/vercel/discussions/424 ;
Mongoose have this built-in, and it’s called connection pool. Default is 100 connections, which means Mongoose will open 100 connections to MongoDB server, and it will keep them for all the queries in your server.
You can override the default to some other number.