GraphQL Java:使用@Batched DataFetcher

Posted

技术标签:

【中文标题】GraphQL Java:使用@Batched DataFetcher【英文标题】:GraphQL Java: Using @Batched DataFetcher 【发布时间】:2017-06-21 20:03:20 【问题描述】:

我知道怎么retrieve a bean from a service in a datafetcher:

public class MyDataFetcher implements DataFetcher 
  ...

  @Override
  public Object get(DataFetchingEnvironment environment) 
    return myService.getData();
  

但是具有嵌套列表的架构应该使用 BatchedExecutionStrategy 并使用带有注解 @Batched (see graphql-java doc) 的 get() 方法创建批处理 DataFetchers。

但是我应该把我的 getData() 调用放在哪里呢?

///// Where to put this code?
List list = myService.getData();
/////

public class MyDataFetcher implements DataFetcher 

  @Batched
  public Object get(DataFetchingEnvironment environment) 
    return list.get(environment.getIndex()); // where to get the index?
  

【问题讨论】:

【参考方案1】:

警告:原来的BatchedExecutionStrategy 已被弃用并将被删除。当前首选的解决方案是Data Loader library。此外,整个执行引擎将在未来被替换,新的将再次支持“本机”批处理。您已经可以使用the new engine 和the new BatchedExecutionStrategy(都在nextgen 包中),但它们对检测的支持有限。下面的答案同样适用于旧版和下一代执行引擎。

这样看。正常DataFetcherss 接收单个对象作为源 (DataFetchingEnvironment#getSource) 并返回单个对象作为结果。例如,如果您有这样的查询:


   user (name: "John") 
       company 
           revenue
       

您的company 解析器(提取器)将获得一个User 对象作为源,并且预计会以某种方式返回一个基于该对象的Company,例如

User owner = (User) environment.getSource();
Company company = companyService.findByOwner(owner);
return company;

现在,在完全相同的场景中,如果您的 DataFetcher 被批处理,并且您使用 BatchedExecutionStrategy,而不是接收 User 并返回 Company,您将收到 List<User> 并且会而是返回 List<Company>

例如

List<User> owners = (List<User>) environment.getSource();
List<Company> companies = companyService.findByOwners(owners);
return companies;

请注意,这意味着您的底层逻辑必须有一种方法可以一次获取多个内容,否则它不会被批处理。因此,您的 myService.getData 调用需要更改,除非它已经可以一次性获取多个源对象的数据。

还请注意,批处理解析仅在嵌套查询中有意义,因为***解析器已经可以获取对象列表,而无需批处理。

【讨论】:

以上是关于GraphQL Java:使用@Batched DataFetcher的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 优化器之Index merge Multi-Range Read MRR与Batched Key Access使用案例详解

Block Nested-Loop 和 Batched Key Access

graphql servlet 未使用 graphql-java-tools 启动(未找到模式文件?)

使用 graphql-java 构建 Relay GraphQL 服务器

如何在 Java 中使用 GraphQL?

如何使用 graphql-spring-boot 向 GraphQL Java 添加检测?