Я использую pg-обещание в приложении GraphQL, и из-за вложенной / итеративной природы распознавателей каждый HTTP-запрос составляет лот запросов к базе данных.
Итак, мне интересно, существует ли более эффективный способ совместного использования соединения из пула соединений, когда средства сбора данных собирают данные?
Я понимаю, что задача pg-promise
существует только для обратного вызоваи я не вижу другого способа связать запросы (как задокументировано здесь ).
Пример
Запрос 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, но я не могу позволить себе сейчас перестроить это приложение и простоболее эффективная работа с соединениями с базой данных будет огромным выигрышем в производительности.
Спасибо.