node.js - 在 http 请求的各个部分共享 pg-promise 任务
问题描述
我在 GraphQL 应用程序中使用pg-promise,并且由于解析器的嵌套/迭代性质,每个 HTTP 请求都会进行大量数据库查询。
所以我想知道当解析器正在收集数据时,是否有一种更有效的方法来共享连接池中的连接?
我知道pg-promise
任务仅在函数回调时才有效,并且我看不到任何其他方式来链接查询(如此处所述)。
例子
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 之类的问题的技术,但目前我无法重新架构此应用程序,而仅仅提高数据库连接的效率将是一个巨大的性能提升。
谢谢你。
解决方案
池中的每个 HTTP 端点和每个数据库连接都是异步的。
如果您尝试跨多个 HTTP 端点重用相同的数据库连接,那么每当它们需要访问数据库时,它们就会相互阻塞,这是不好的。
如果池中的连接数少于访问数据库的 HTTP 端点数,那么您的 HTTP 服务的可扩展性很差。您需要至少与 HTTP 端点的连接数相匹配。
因此,您正在寻找的 - 跨多个 HTTP 端点共享数据库连接是一个坏主意。
如果您想在单个 HTTP 请求中对多个数据解析器进行分组,您可以在单个任务中统一处理逻辑(请参阅任务)。
还有手动连接,通过方法connect,但我不建议将它用于一般连接重用,因为它适用于特定情况,否则容易出错并使自动连接的想法无效。
推荐阅读
- python - 将字典列表转换为关于键的数据框
- node.js - 如何使用 Node.js 从 Google Drive 流式传输视频
- google-apps-script - Google Add-ons 是否可以像 Outlook Add-ins 这样有限的发布?
- python - 在 Photoshop 和 Illustrator 上使用 openCV 和 PIL 运行 python 脚本
- r - Textnets (R) 将节点从组更改为单词
- python - ChecksumMismatchError:Conda 检测到预期内容与下载内容不匹配
- python - 有选择地乘以 pandas DataFrame 值的更简洁的方法
- python - 有没有办法让网格线标签只出现在一组轴上?
- bash - 将制表符分隔的数组转换为 bash 中的列表
- c++ - 如何选择元组类型的子集并从子集的内容创建另一个元组?