pg promise:向不同库传递连接的推荐模式

  • 本文关键字:连接 模式 promise pg pg-promise
  • 更新时间 :
  • 英文 :


这个问题是针对pg promise的,它的推荐使用模式&基于以下假设,

如果它们连接到同一个数据库,那么创建多个pgp实例是没有意义的(也可以通过"为同一连接创建重复的数据库对象"的良好警告消息来强制执行(

给定:我有两个单独的包需要DB连接,目前他们从外部获取构造函数中的连接字符串,并在其中创建连接对象,这导致了重复连接对象的警告,这是公平的,因为他们都与同一个DB对话,并且这里有优化的可能性(因为我控制着这些包(。

然后:为了防止这种情况,我考虑实现依赖注入,为此,我在库构造函数中传递一个解析函数,该函数为它们提供DB连接对象。

问题:有一些顶级设置,如解析器、助手和事务模式,对于这些包中的每一个都可能不同。建议使用哪些设置,或者是否有更好的模式来解决这些问题。例如:

const pg = require('pg-promise');
const instance = pg({"schema": "public"});
instance.pg.types.setTypeParser(1114, str => str);//UTC Date which one library requires other doesnt
const constring = "";
const resolveFunctionPackage1 = ()=>instance(constring);
const resolveFunctionPackage2 = ()=>instance(constring);

综上所述:实现pg promise依赖注入的最佳方式是什么?

我有两个单独的包需要DB连接,目前他们从外部获取构造函数中的连接字符串,并在其中创建连接对象

这是一个严重的设计缺陷,它永远不会正常工作。任何使用数据库的独立包都必须能够重用现有的连接池,这在连接使用方面是最有价值的资源。在独立模块内直接复制连接池将耗尽现有的物理连接,并阻碍需要使用相同物理连接的所有其他模块的性能。

如果第三方库支持pg promise,那么它应该能够接受实例化的db对象来访问数据库。

如果第三方库只支持基本驱动程序,那么它至少应该接受一个实例化的Pool对象。在pg promise中,db对象通过db公开底层Pool对象$水塘

当他们想要设置冲突的类型解析器时会发生什么?

会有冲突,因为pg.types是底层驱动程序的单例,所以只能用一种方式进行配置。这是一个不幸的限制。

避免这种情况的唯一方法是,可重用模块永远不要重新配置解析器。它应该只在实际的客户端应用程序中完成。

更新

严格来说,应该避免将应用程序的数据库访问层拆分为多个模块,这可能会带来许多问题。

但特别是对于类型解析器的分离,库支持在池级别设置自定义类型解析器。请参阅此处的示例。请注意,更新仅针对TypeScript,即在JavaScript客户端中,它已经工作了一段时间。

因此,您仍然可以让您的单独模块创建自己的db对象,但我建议您将其连接池大小限制在最小值,如1:

const moduleDb = pgp({
// ...connection details...
max: 1, // set pool size to just 1 connection
types: /* your custom type parsers */
});

最新更新