簡體   English   中英

為什么要在 Next.js 中緩存 MongoDB 連接? 它有效嗎?

[英]Why cache MongoDB connection in Next.js? And does it work?

我正在創建一個 Next.js 應用程序,我注意到許多開發人員緩存了 MongoDB 連接。 例如

let cachedClient = null;
let cachedDb = null;

export async function connectToDatabase() {
    if (cachedClient && cachedDb) {
        return {
            client: cachedClient,
            db: cachedDb,
        };
    }

    const opts = {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    };

    let client = new MongoClient(MONGODB_URI, opts);
    await client.connect();
    let db = client.db(MONGODB_DB);

    cachedClient = client;
    cachedDb = db;

    return {
        client: cachedClient,
        db: cachedDb,
    };
}

或者

let cached = global.mongoose

if (!cached) {
  cached = global.mongoose = { conn: null, promise: null }
}

async function dbConnect () {
  if (cached.conn) {
    return cached.conn
  }

  if (!cached.promise) {
    const opts = {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      bufferCommands: false,
      bufferMaxEntries: 0,
      useFindAndModify: true,
      useCreateIndex: true
    }

    cached.promise = mongoose.connect(MONGODB_URI, opts).then(mongoose => {
      return mongoose
    })
  }
  cached.conn = await cached.promise
  return cached.conn
}

我從未在 Express 應用程序中看到過這種情況,所以我有兩個問題:

  1. 為什么在 Next.js 中緩存數據庫連接如此普遍,而我在 Express.js 中從未見過。 他這樣做的原因是什么? 它是如何工作的? 這值得嗎?
  2. 正如您在上面的示例中看到的那樣,一些開發人員使用有用的 let 變量,而其他一些開發人員使用全局變量。 有什么區別,哪個是更好的解決方案?

在 Next.Js 中,您可以緩存一些變量,mongo 連接就是其中之一。 它將顯着提高應用程序的響應時間,因為對頁面的第一次調用將使所有調用 mongo 以建立連接,並且這樣做可能需要超過 2 秒,在您穩定此連接后,您可以重用未來對同一頁面的調用(在本地緩存的情況下),它將分配花費在創建連接上的那 2 秒(從而更快地響應您的用戶)。

例如:

1° Request to your page:
2300ms spent to get a response //Had to establish a new connection with mongo

2° Request to your page:
230ms spent to get a response //Used cached connection

3° Request to your page:
180ms spent to get a response //Used cached connection

4° Request to your page:
210ms spent to get a response //Used cached connection
...

全局緩存和“讓”緩存之間的區別在於哪些函數將使用相同的連接。 根據您的應用程序的用途,您可以使用全局緩存,它將防止您的應用程序中的每個 function 創建您自己的與 mongo 的連接,並花費我提到的 2 秒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM