我在GraphQL应用程序中使用pg-promise,由于解析程序的嵌套/迭代性质,每个HTTP请求都会进行 lot 个数据库查询。
所以我想知道在解析器收集数据时,有没有更有效的方法可以从连接池共享连接?
我了解到pg-promise
任务仅在函数的回调中有效,并且我看不到任何其他方式链接查询(如here所述)。
GraphQL查询:
{
users {
files {
name
date
}
}
}
时的解析器示例
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>
谢谢。
答案 0 :(得分:1)
每个HTTP端点和池中的每个数据库连接都是异步的。
如果您试图在多个HTTP端点之间重用同一数据库连接,那么当它们需要访问数据库时,它们将相互阻塞,这是不好的。
并且如果池中的连接数少于访问数据库的HTTP端点数,则说明您自己的伸缩性很差。您需要的连接数量至少要与HTTP端点的数量匹配。
因此,您要寻找的-在多个HTTP端点之间共享数据库连接是一个不好的主意。
如果要在单个HTTP请求中将多个数据解析器分组,则可以统一单个任务中的处理逻辑(请参见Tasks)。
也有通过方法connect进行的手动连接,但我不建议将其用于常规连接重用,因为在某些情况下会出现这种情况,否则容易出错,并且会使自动连接的思想无效