在http请求的各个部分之间共享pg
我在GraphQL应用程序中使用pg-promise,并且由于解析器的嵌套/迭代特性,每个HTTP请求都会进行大量的数据库查询。
所以我想知道当解析器收集数据时是否有更有效的方法从连接池共享连接?
我知道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这样的问题,但我现在无法重新设计这个应用程序,只是通过数据库连接提高效率将是一个巨大的性能胜利。
谢谢。
回答如下:来自池的每个HTTP端点和每个数据库连接都是异步的。
如果您尝试跨多个HTTP端点重用相同的数据库连接,那么只要它们需要访问数据库,它们就会相互阻塞,这是不好的。
如果池中的连接数小于访问数据库的HTTP端点数,那么您自己就拥有了一个可扩展性很差的HTTP服务。您至少需要连接数以匹配HTTP端点的连接数。
所以你要找的是 - 在多个HTTP端点之间共享数据库连接是一个坏主意。
如果要在单个HTTP请求中对多个数据解析器进行分组,则可以在单个任务中统一处理逻辑(请参阅Tasks)。
还有手动连接,通过方法connect,但我不推荐它用于一般连接重用,因为它是针对特定情况,否则可能容易出错并且使自动连接的想法无效。
在http请求的各个部分之间共享pg
我在GraphQL应用程序中使用pg-promise,并且由于解析器的嵌套/迭代特性,每个HTTP请求都会进行大量的数据库查询。
所以我想知道当解析器收集数据时是否有更有效的方法从连接池共享连接?
我知道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这样的问题,但我现在无法重新设计这个应用程序,只是通过数据库连接提高效率将是一个巨大的性能胜利。
谢谢。
回答如下:来自池的每个HTTP端点和每个数据库连接都是异步的。
如果您尝试跨多个HTTP端点重用相同的数据库连接,那么只要它们需要访问数据库,它们就会相互阻塞,这是不好的。
如果池中的连接数小于访问数据库的HTTP端点数,那么您自己就拥有了一个可扩展性很差的HTTP服务。您至少需要连接数以匹配HTTP端点的连接数。
所以你要找的是 - 在多个HTTP端点之间共享数据库连接是一个坏主意。
如果要在单个HTTP请求中对多个数据解析器进行分组,则可以在单个任务中统一处理逻辑(请参阅Tasks)。
还有手动连接,通过方法connect,但我不推荐它用于一般连接重用,因为它是针对特定情况,否则可能容易出错并且使自动连接的想法无效。