я должен открывать / закрывать разные соединения Postgres в одной конечной точке узла? заставить эту работу с ООП - PullRequest
1 голос
/ 26 мая 2019

Я настраиваю возможность для моего сервера узлов загружать правильную информацию из моей БД (postgres) для визуализации определенного клиентского представления.В настоящее время я выполняю рефакторинг своего серверного кода, чтобы следовать объектно-ориентированному подходу с конструкторами классов.

В настоящее время он у меня есть, так что Readers - это класс функций, которые отвечают за выполнение запросов на чтение на моембаза данных.Я унаследовал классы, такие как MainViewReader и MatchViewReader, и все они наследуются от класса "Reader", который создает соединение с postgres, используя библиотеку pg-prom .

Проблема в том, что я не могу использовать два читателя представления, или они будут открывать дубликаты соединений, поэтому я нахожу себя пишущим избыточный код.Поэтому я считаю, что у меня есть два варианта дизайна, и мне было интересно, что было более эффективным:

  1. Вместо того, чтобы устанавливать шаблон как представление сервлета, вместо этого установите шаблон как таблица, читаемая с помощью этогокласс, то есть NewsTableReader "MatchTableReader. Преимущество этого заключается в том, что ни один из кодов не является избыточным и может использоваться в различных сервлетах, а Con - то, что мне придется прервать соединение с postgres на каждом экземпляре класса Reader до того, каксоздание нового экземпляра как такового:
const NewsTableReader = NewsTableReader()
await NewsTableReader.close()

const MatchTableReader = MatchTableReader()
await MatchTableReader.close()

Просто просмотр читателей.Преимущество состоит в том, что это только одно постоянное соединение, минусы в том, что существует много избыточного кода, если я загружаю данные из одних и тех же таблиц в разных представлениях, например:
const MatchViewReader = MatchViewReader()
await MatchViewReader.load_news()
await MatchViewReader.load_matches()

Какой подходбольше всего повлияет на мою производительность?

1 Ответ

2 голосов
/ 27 мая 2019

Вы правильно убедились, что не следует создавать несколько пулов подключений с одинаковыми параметрами подключения 1 . Но это не должно влиять на структуру вашего кода.

Вы можете создать глобальный пул и передать его своим Reader конструкторам, как своего рода Внедрение зависимостей :

class Reader {
  constructor(db) {
    this._db = db
  }
}

class NewsTableReader extends Reader {}
class MatchTableReader extends Reader {}


const pgp = require('pg-promise')(/* library options */)
const db = (/* connection options */)

const newsTableReader = new NewsTableReader(db)
const matchTableReader = new MatchTableReader(db)

await newsTableReader.load()
await matchTableReader.load()
// await Promise.all([newsTableReader.load(), matchTableReader.load()])

Другой способ - использовать те же классы с событием extend библиотеки pg-promise:

const pgp = require('pg-promise')({
  extend(obj, dc) {
    obj.newsTableReader = new NewsTableReader(obj);
    obj.matchTableReader = new MatchTableReader(obj);
  }
})

const db = (/* connection options */)

await db.newsTableReader.load()

await db.tx(async t => {
    const news = await t.newsTableReader.load();
    const match = await t.matchTableReader.load();
    return {news, match};
});

Преимущество события extend заключается в том, что вы можете использовать все функции (например, транзакции и задачи ), предоставляемые библиотекой pg-promise, для разных моделей. , Следует помнить, что при каждом вызове db.task(), db.tx() и db.connect() он создает новые объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...