Примечание. Эта проблема в основном связана с одноэлементными объектами в узле, а не с пулами БД
Я создаю приложение expressjs, используя модуль узла mysqljs для соединений с БД. Я хочу создать один объект пула, который можно повторно использовать в приложении (для разных моделей и т. Д.). Я хочу знать, как правильно использовать один экземпляр объекта в экспресс-приложении
Я видел много примеров, когда люди создают файл db.js или файл pool.js и требуют его там, где они нужны
// db.js
var mysql = require('mysql');
var pool;
module.exports = {
getPool: function () {
if (pool) return pool;
pool = mysql.createPool(dbConfig);
return pool;
}
};
// app.js
var pool = require('pool').getPool();
pool.query('SELECT * FROM users');
Однако я чувствую, что это все-таки неправильный подход, поскольку вы полагаетесь на кеш nodejs, чтобы возвращать один и тот же экземпляр каждый раз, когда вам требуется объект. Если бы узел заканчивал тем, что загружал код дважды, вы бы получили два пула, например
const poolA = require('./pool').getPool();
const poolB = require('./POOL').getPool(); // resolves to same file but node will not get result from cache
console.log(poolA === poolB); // false
Из большинства вещей, которые я прочитал, как правило, не рекомендуется использовать одноэлементные объекты в приложениях вашего узла из-за такого поведения, но это похоже на распространенный вариант использования для приложений Express. Поэтому мне было интересно, как люди создают свой единый пул на протяжении всего срока службы приложения?
Примечание. В данный момент я выполняю создание экземпляра пула в корне приложения, а затем передаю экземпляр в качестве параметра функции конструктора, но мне это тоже не нравится