Изучаю Next.js. И заметил такое, что соединение с базой данных часто кэшируют. Например, так:
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
}
Касательно этого у меня появилось 2 вопроса. 
	- Я ни разу не встречал такого в Express.js. Но в Next.js-проектах кэширование соединения встречается довольно часто. Почему это так? И для чего это делается? 
 
	- В двух примерах немного разная реализация. В первом примере через простую let-переменную. Во втором примере через глобальную переменную. В чем разница? И какой подход лучше?