我正在设置节点服务器从DB(Postgres(加载适当信息以渲染某个客户端视图的能力。我目前正在重构我的服务器代码,以遵循使用类构造函数的面向对象的方法。
我当前拥有它,以便Readers
是一类功能,负责在我的数据库上运行读取查询。我已经继承了诸如MainViewReader
和MatchViewReader
之类的类,它们都从"读取器"类继承,该类使用 pg-promise Library 实例化与Postgres的连接。
问题是我不能使用两个视图读者,否则他们将打开重复的连接,因此我发现自己编写了冗余代码。所以我相信我有两个设计选择,我想知道什么更有效:
- 而不是通过servlet视图设置模式,而是设置表格在表中使用该类的模式,即
NewsTableReader
"MatchTableReader
。该代码是多余的,可以在不同的servlets中使用是我必须结束与邮政的连接在实例化新课程之前,读者类的实例:
const NewsTableReader = NewsTableReader()
await NewsTableReader.close()
const MatchTableReader = MatchTableReader()
await MatchTableReader.close()
- 只有查看读者。专业人士是,这只是一个持久的连接,缺点是我有很多冗余代码在不同视图中从同一表中加载数据,例如:
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()
调用。