GraphQL-API's met Spring Boot · Les

Het N+1-probleem uitgelegd

Begrijp het N+1-queryprobleem in GraphQL en de impact ervan op de prestaties van API's.

Les 1 van 411 stappen

Het N+1-probleem uitgelegd is een gratis GraphQL-API's met Spring Boot-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject GraphQL-API's met Spring Boot. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus GraphQL-API's met Spring Boot bevat in totaal 4 lessen.

Waarom API-prestaties belangrijk zijn

Bij het bouwen van API's zijn prestaties essentieel! Trage API's kunnen gebruikers frustreren en zorgen voor een slechte ervaring.

Een veelgemaakte fout die je GraphQL-API aanzienlijk kan vertragen, staat bekend als het N+1-probleem. Het begrijpen hiervan is de eerste stap naar het bouwen van efficiënte applicaties.

Wat is het N+1-probleem?

Het N+1-probleem ontstaat wanneer je applicatie één query uitvoert om een lijst met primaire items op te halen en vervolgens N aanvullende query's uitvoert om voor elk van die N items afzonderlijk gerelateerde gegevens op te halen.

Dit resulteert in in totaal N+1 databasequery's, wat erg inefficiënt kan zijn.

Een conceptueel voorbeeld

Stel je voor dat je een lijst met blogberichten hebt en dat elk bericht een auteur heeft.

  • Query 1: Haal alle 10 blogberichten op.
  • Query's N: Haal vervolgens voor elk van de 10 berichten de auteur afzonderlijk op (10 extra query's).

Totaal: 1 (voor berichten) + 10 (voor auteurs) = 11 databasequery's!

Waarom dit vaak voorkomt in GraphQL

De flexibele aard van GraphQL, waarbij elk veld een eigen resolver kan hebben, maakt het N+1-probleem erg gebruikelijk.

Wanneer een client een lijst met items en een gerelateerd veld voor elk item opvraagt, kan de standaardresolutiestrategie N afzonderlijke databaseaanroepen voor die gerelateerde gegevens veroorzaken.

GraphQL-schema-voorbeeld

Bekijk dit eenvoudige GraphQL-schema:

type Author {
  id: ID!
  name: String!
}

type Book {
  id: ID!
  title: String!
  author: Author!
}

type Query {
  books: [Book!]
}

Als we books { title author { name } } opvragen, kan er gemakkelijk een N+1-probleem ontstaan.

Naïeve resolvercode

Hier is een vereenvoudigd Java-voorbeeld dat laat zien hoe een naïeve resolver N+1 kan veroorzaken. Deze code simuleert de aanroepen, maar is geen volledige GraphQL-configuratie.

import java.util.List;
import java.util.ArrayList;

class Book {
    String id; String title; String authorId;
    public Book(String id, String title, String authorId) {
        this.id = id; this.title = title; this.authorId = authorId;
    }
}

class Author {
    String id; String name;
    public Author(String id, String name) {
        this.id = id; this.name = name;
    }
}

class BookRepository {
    List<Book> findAll() { // Simulates DB call 1
        System.out.println("DB: Fetching all books...");
        List<Book> books = new ArrayList<>();
        books.add(new Book("b1", "GraphQL Intro", "a1"));
        books.add(new Book("b2", "Spring Boot Guide", "a2"));
        return books;
    }
}

class AuthorRepository {
    Author findById(String id) { // Simulates N DB calls
        System.out.println("DB: Fetching author by ID: " + id + "...");
        if ("a1".equals(id)) return new Author("a1", "Alice");
        if ("a2".equals(id)) return new Author("a2", "Bob");
        return null;
    }
}

public class Main {
  public static void main(String[] args) {
    BookRepository bookRepo = new BookRepository();
    AuthorRepository authorRepo = new AuthorRepository();

    // GraphQL 'books' resolver
    List<Book> books = bookRepo.findAll(); // 1st query

    // For each book, GraphQL 'author' field resolver is called
    for (Book book : books) {
      authorRepo.findById(book.authorId); // N queries
    }
    System.out.println("\nTotal queries: 1 (for books) + N (for authors)");
  }
}

De N+1-query's volgen

In het vorige codevoorbeeld geldt het volgende als bookRepo.findAll() twee boeken retourneert:

  • De eerste databaseaanroep haalt alle boeken op. (1 query)
  • Vervolgens wordt voor elk van die 2 boeken authorRepo.findById() aangeroepen. Dit resulteert in 2 afzonderlijke databaseaanroepen. (N query's, waarbij N=2)

Totaal aantal databaseaanroepen = 1 + 2 = 3. Stel je voor dat dit om 100 boeken gaat!

Impact op prestaties

Het N+1-probleem kan de prestaties van je API ernstig verslechteren:

  • Hogere latentie: Veel kleine databasequery's duren door de netwerkoverhead langer dan een kleiner aantal grotere query's.
  • Hoger resourcegebruik: Elke query gebruikt databaseverbindingen, CPU en geheugen, wat tot knelpunten leidt.
  • Schaalbaarheidsproblemen: Naarmate de hoeveelheid gegevens en het aantal gebruikers groeien, wordt het probleem erger. Je API wordt trager en reageert mogelijk niet meer.

Het probleem herkennen

Hoe weet je of je met een N+1-probleem te maken hebt?

  • Logboeken van databasequery's: Zoek naar een patroon waarbij één query wordt gevolgd door veel identieke of sterk vergelijkbare query's voor gerelateerde gegevens.
  • Profileringstools: Tools zoals Spring Boot Actuator, specifieke GraphQL-profilers of APM-services (Application Performance Monitoring) kunnen de uitvoeringstijden van resolvers en het aantal databaseaanroepen per verzoek tonen.

Test je kennis

Welke van de volgende scenario's beschrijft het N+1-probleem bij het ophalen van API-gegevens het best?

Samenvatting: N+1 uitgelegd

Goed gedaan! In deze les hebben we het N+1-probleem onderzocht:

  • Het ontstaat wanneer je een lijst met N items ophaalt en vervolgens N afzonderlijke query's uitvoert voor de gerelateerde gegevens van elk item.
  • Dit patroon komt vaak voor in GraphQL vanwege de resolvergebaseerde architectuur.
  • Het leidt tot aanzienlijke prestatieproblemen, zoals hogere latentie en een hoger resourcegebruik.
  • Je kunt het herkennen door de logboeken van databasequery's te controleren en profileringstools te gebruiken.

Hierna gaan we bekijken hoe GraphQL DataLoaders een elegante oplossing bieden voor dit veelvoorkomende probleem!

Gratis beginnen

Leer GraphQL-API's met Spring Boot met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
12
Lessen
48

Veelgestelde vragen

Is de les “Het N+1-probleem uitgelegd” gratis?

Ja — de volledige tekst van “Het N+1-probleem uitgelegd” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus GraphQL-API's met Spring Boot wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus GraphQL-API's met Spring Boot bevat in totaal 4 lessen.

Wat leer ik in “Het N+1-probleem uitgelegd”?

Begrijp het N+1-queryprobleem in GraphQL en de impact ervan op de prestaties van API's. Je oefent met GraphQL-API's met Spring Boot door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met GraphQL-API's met Spring Boot te beginnen?

Ervaring vooraf is niet nodig. GraphQL-API's met Spring Boot op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Het N+1-probleem uitgelegd”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over GraphQL-API's met Spring Boot?

Ja. Elke les over GraphQL-API's met Spring Boot bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Het N+1-probleem uitgelegd
  2. Kennismaken met GraphQL DataLoaders
  3. Batching en caching implementeren
  4. DataLoaders met Spring Context en async verwerking
← Terug naar GraphQL-API's met Spring Boot