我是 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 是否有任何优点将非常有帮助。