我应该在一个节点端点中打开/关闭不同的邮政连接吗?与OOP一起工作



我正在设置节点服务器从DB(Postgres(加载适当信息以渲染某个客户端视图的能力。我目前正在重构我的服务器代码,以遵循使用类构造函数的面向对象的方法。

我当前拥有它,以便Readers是一类功能,负责在我的数据库上运行读取查询。我已经继承了诸如MainViewReaderMatchViewReader之类的类,它们都从"读取器"类继承,该类使用 pg-promise Library 实例化与Postgres的连接。

问题是我不能使用两个视图读者,否则他们将打开重复的连接,因此我发现自己编写了冗余代码。所以我相信我有两个设计选择,我想知道什么更有效:

  1. 而不是通过servlet视图设置模式,而是设置表格在表中使用该类的模式,即 NewsTableReader" MatchTableReader。该代码是多余的,可以在不同的servlets中使用是我必须结束与邮政的连接在实例化新课程之前,读者类的实例:
const NewsTableReader = NewsTableReader()
await NewsTableReader.close()
const MatchTableReader = MatchTableReader()
await MatchTableReader.close()
  1. 只有查看读者。专业人士是,这只是一个持久的连接,缺点是我有很多冗余代码在不同视图中从同一表中加载数据,例如:
const MatchViewReader = MatchViewReader()
await MatchViewReader.load_news()
await MatchViewReader.load_matches()

哪种方法将对我的表现产生最大的影响?

您已正确确定您不应使用相同的连接选项创建多个连接池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()])

另一种方法是使用pg-promise库的extend事件使用相同的类:

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()调用。

上创建新对象。

最新更新