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

时间:2019-02-13 20:39:53

标签: node.js graphql apollo-server pg-promise

我在GraphQL应用程序中使用pg-promise,由于解析程序的嵌套/迭代性质,每个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 = $1', userId);
  }
}

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

注意

我知道诸如dataloader之类的技术可以解决N + 1 Select之类的问题,但是我目前无法重新设计该应用程序,而仅通过数据库连接提高效率将是巨大的性能胜利。 / p>

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

并且如果池中的连接数少于访问数据库的HTTP端点数,则说明您自己的伸缩性很差。您需要的连接数量至少要与HTTP端点的数量匹配。

因此,您要寻找的-在多个HTTP端点之间共享数据库连接是一个不好的主意。

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

也有通过方法connect进行的手动连接,但我不建议将其用于常规连接重用,因为在某些情况下会出现这种情况,否则容易出错,并且会使自动连接的思想无效