Spring Boot/GraphQL 和 SQL 语句数量(N+1 期)

2024-02-06

我是 Graphql 的新手,正在研究创建概念证明以了解其工作原理。我正在使用 Spring Boot (2.2.2.RELEASE) 并引入 graphql-spring-boot-starter。

<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>6.0.1</version>
</dependency>

我已使用以下配置将 graphql 架构设置为类路径上的文件:

type Order {
  orderNumber: ID!
  customers: [Customer]
  items: [Item]
}

type Customer {
  customerNumber: ID!
  fullName: String
  postalAddresses: [PostalAddress]
}

type PostalAddress {
  line1: String
  line2: String
  city: String
  stateCode: String
  postalCode: String
  postalCodeExtension: String
  countryCode: String
}

type Item {
  itemId: ID!
  fullDescription: String
}

type Query {
  findOrdersByCustomerNumber(customerNumber: String): [Order]
}

我创建了一个根查询类:

@Component
public class Query implements GraphQLQueryResolver {
    private OrderService orderService;

    @Autowired
    public Query(OrderService orderService) {
        this.orderService = orderService;
    }

    public List<Order> findOrdersByCustomerNumber(String customerNumber) {
        return this.orderService.findOrdersByCustomerNumber(customerNumber);
    }
}

这是我的订单解析器:

@Component
public class OrderResolver implements GraphQLResolver<Order> {
    private ItemRepository itemRepository;
    private CustomerRepository customerRepository;

    @Autowired
    public OrderResolver(CustomerRepository customerRepository, ItemRepository itemRepository) {
        this.customerRepository = customerRepository;
        this.itemRepository = itemRepository;
    }

    public List<Item> item(Order order) {
        return itemRepository.findItemsByOrderNumber(order.getOrderNumber());
    }

    public List<Customer> customers(Order order) {
        return customerRepository.findCustomersByOrderNumber(order.getOrderNumber());
    }
}

一切似乎都工作正常,我可以发送 graphql 请求并获得响应。它实际上非常容易实现,并且这个库让我能够如此快速地实现这一点给我留下了深刻的印象。

然而,这是我的问题。这是可怕的 n+1 SQL 问题。

所以,当我有 162 个订单的客户时。

  1 = Driver SQL (get all the orders for the customer number)
162 = Customer SQL (One query is fired off for each order and it's same customer for each select)
162 = Postal Address SQL (One query is fired off for each customer...note, not included in the code snippets)
162 = Item SQL (assume one item per order).

因此,总共有 487 个 SQL 查询。因此,这会对性能产生影响。我正在使用直接 JDBC 来查询数据库(目前没有 JPA 或 ORM)。

我的问题是如何在根查询解析器中获取 GraphQL 请求,以便可以操作图中依赖对象的 SQL?在进行一些研究时,我发现在 Node/Javacript 世界中,有一个数据加载器实用程序可以帮助解决这个问题(https://github.com/graphql/dataloader https://github.com/graphql/dataloader)

所以,我不清楚如何用这个java实现来解决这个问题。如果有人有任何建议或示例代码,这对于了解此 POC 是否有任何优点将非常有帮助。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot/GraphQL 和 SQL 语句数量(N+1 期) 的相关文章

随机推荐

  • 即使安装了 mtl,也找不到模块“Control.Monad.State”

    当我尝试加载包含的模块时import Control Monad State I got Could not find module Control Monad State Perhaps you meant Control Monad S
  • 语义分割中的上采样

    我正在尝试实现一篇关于语义分割的论文 但我对如何对分割网络生成的预测图进行上采样以匹配输入图像大小感到困惑 例如 我使用 Resnet101 的变体作为分割网络 如本文所使用 通过这种网络结构 大小为 321x321 的输入 论文中再次使用
  • Log4net - 如何知道文件何时滚动?

    我有一个由 log4net 创建的日志文件 该文件每小时都会更改 有没有办法知道这个滚动何时发生 就像 log4net 库中的一个事件一样 我可以绑定到该事件 并在触发该事件时执行操作 我不是在寻找代码示例 只是想知道此事件是否存在 以及在
  • 当按下引号键时,java.awt.Robot.keyPress 抛出 IllegalArgumentException

    当您尝试使用 Robot keyPress 键入 双引号 它抛出 java lang IllegalArgumentException Invalid key code 我该如何解决或解决这个问题 如果有帮助的话 我目前使用的是 Windo
  • 在 .htaccess 重定向中保留 HTTP/HTTPS 协议

    我必须在 htaccess 中将端口 80 重定向到 2368 但我想保持请求的协议完整 以便 SSL 不会中断 我目前有这个 RewriteCond HTTP HOST sub domain com NC RewriteRule http
  • 如何向 fpdf 添加新字体?

    如何将 Gotham book 字体添加到 fpdf 中 大多数解释都不清楚并且很难理解 我需要一个例子 请问有人可以帮忙吗 没关系 得到了我的答案 Go to http www fpdf org makefont http www fpd
  • ASP.Net MVC3 Azure - 我需要会员提供程序存储过程吗?

    我正在使用 Azure 作为数据库存储来创建我的第一个 ASP Net MVC3 应用程序 有很多很棒的教程 但我目前正在使用这个 演练 在 Windows Azure 上托管 ASP NET Web 应用程序 http msdn micr
  • 如何在 Spring 中以编程方式获取当前活动/默认环境配置文件?

    我需要根据不同的当前环境配置文件编写不同的逻辑 如何从 Spring 获取当前活动的和默认的配置文件 您可以自动连接Environment https docs spring io spring framework docs current
  • 向面板添加鼠标单击事件

    我想分配mouseclick事件至asp net panel protected void Page Load object sender EventArgs e Panel p new Panel p Click new EventHan
  • Protege 中复杂类的推理

    我想做出这样的推论 比如图中灰色虚线代表的属性 我断言了一个普遍的公理 hasTaste some Bitter SubClassOf goesWellWith some hasTaste some Sweet 其中 bitter 是 Bi
  • new Date() 在 Chrome 和 Firefox 中的工作方式不同

    我想将日期字符串转换为Date通过 javascript 使用以下代码 var date new Date 2013 02 27T17 00 00 alert date 2013 02 27T17 00 00 是来自服务器的 JSON 对象
  • 使用 javascript 和 localStorage 加载样式表

    我正在使用 Jekyll 网站 这并不重要 因为这是一个静态页面 我只是将其编写为附加信息 期望的行为 我想通过 javascript 加载我的样式表 因此它可以依赖于本地存储的值 比方说dark and light 我用下面的代码做了一个
  • Scala 向右折叠和向左折叠

    我正在尝试学习函数式编程和 Scala 因此我正在阅读 Chiusano 和 Bjarnason 撰写的 Scala 函数式编程 我无法理解左折叠和右折叠方法在列表中的作用 我环顾四周 但没有找到适合初学者的东西 所以书上提供的代码是 de
  • ItemTemplate中的控件无法在Code Behind中调用

    我有服务器控件 例如另一个 gridview 中模板字段内带有 gridview 的弹出窗口
  • 调用数组上的成员函数 getQuery()

    尝试在 Laravel 中处理数据表 Error 调用数组上的成员函数 getQuery 在 Laravel 数据表中 这是 Laravel 代码 控制器 public function get all course requests co
  • 在网页上插入视频

    在网页上插入和显示视频有哪些可能性 不需要用户额外的插件或安装 可用于 flv 以外的格式 例如 f4v avi 在SO我发现了一些这样的问题 stackoverflow com https stackoverflow com questi
  • Xamarin 4.5 .net 上的 NameValueCollection

    我有一个针对 4 5 net 框架的 PCL 项目 我正在文件顶部导入 System Collections Specialized using System Collections Specialized 但我收到 无法找到 NameVa
  • 多种风格的静态 android 快捷方式?

    是否可以在不复制 Shortcuts xml 的情况下定义多种风格的静态快捷方式 我有两种口味 主要 包 com test 免费 包 com test free The 快捷方式 xml看起来像这样
  • 创建一个“阅​​读更多”链接来扩展页面上的内容

    我想创建一个阅读更多链接 该链接将扩展已显示的段落以显示同一页面上的整个文本 如果这个问题可以通过 HTML5 和 CSS 来解决 我希望如此 但我认为需要某种类型的脚本 例如 示例文本 Lorem ipsum dolor sat amet
  • Spring Boot/GraphQL 和 SQL 语句数量(N+1 期)

    我是 Graphql 的新手 正在研究创建概念证明以了解其工作原理 我正在使用 Spring Boot 2 2 2 RELEASE 并引入 graphql spring boot starter