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
包中),但它们对检测的支持有限。下面的答案同样适用于旧版和下一代执行引擎。
这样看。正常DataFetchers
s 接收单个对象作为源 (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 启动(未找到模式文件?)