在 http 请求的各个部分之间共享 pg-promise 任务

Sharing a pg-promise task across parts of an http request

我在 GraphQL 应用程序中使用 pg-promise,并且由于解析器的 nested/iterative 性质,每个 HTTP 请求都会进行 lot 数据库查询。

所以我想知道在解析器收集数据时是否有更有效的方法来共享来自连接池的连接?

我知道 pg-promise 任务仅在函数回调时有效,我看不到任何其他链接查询的方法(如记录 here)。

例子

GraphQL 查询:

{
  users {
    files {
      name
      date
    }
  }
}

使用 Apollo Server

时的解析器示例
Query: {
    users: (obj, args, context, info) => {
      return context.db.manyOrNone('select id from users')
    }
 }

Users: {
  files: (obj, args, context, info) => {
    const userId = obj.id;
    return context.db.manyOrNone('select * from files where user_id = ', userId);
  }
}

如果有很多用户,这将生成很多 SQL 查询。

注意

我知道 dataloader 之类的技术可以解决 N+1 Select 之类的问题,但我目前无法负担重新构建此应用程序的费用,只是提高数据库连接的效率就可以了巨大的性能胜利。

谢谢。

池中的每个 HTTP 端点和每个数据库连接都是异步的。

如果您尝试在多个 HTTP 端点之间重复使用相同的数据库连接,那么当它们需要访问数据库时,它们就会相互阻塞,这是不好的。

如果池中的连接数少于访问数据库的 HTTP 端点数,那么您的 HTTP 服务的可扩展性很差。您的连接数至少需要与 HTTP 端点相匹配。

所以您正在寻找的东西 - 跨多个 HTTP 端点共享数据库连接并不是一个好主意。

如果您想在单个 HTTP 请求中对多个数据解析器进行分组,则可以在单个任务中统一处理逻辑(参见 Tasks)。

也有手动连接,通过方法connect,但我不建议将其用于一般连接重用,因为它用于特定情况,否则容易出错并且使想法无效自动连接。