dans Hibernate

N+1 select issue

N+1 Select issue

Lorsque vous définissez une relation entre 2 entités dans Hibernate, vous avez le choix du mode de chargement :

  • Immédiat (Eagger)
  • tardif (Lazy)

Le n+1 select survient uniquement dans les cas de chargement immédiat.

Prenons un exemple concret.


public class Person{

private Long id;

private String name;

private Adress mainAdress;

//other attributes

// setters & getters

}

public class Adress{

private Long id;

//other attributes

// setters & getters

}

En chargement immédiat lorsque Hibernate charge la relation personne il envoi en fait 2 requêtes en base, un premier select pour récupérer la ligne dans la table Person et un second pour l’adresse. c’est ce qu’on appelle le chargement immédiat ou eagger qui charge automatiquement toutes les relations dépendantes.

Ce mode de chargement est très problématique car vous pouvez rapidement vous retrouver avec une grosse grappe d’objets pas nécéssaire en mémoire.

Le cas vraiment pénalisant est lorsque vous travaillez sur un tableau de données, vous avez demandé  à Hibernate par exemple une liste de personne, Hibernate va alors générer 1 requête pour récupérer la liste de personnes + 1 requête pour chacune des adresses associées.

Si ma liste contient 200 personnes hibernate me générera 201 requêtes (Imaginer l’overhead côté DB) d’où l’appellation n+1 select.

Dans un prochain post nous verrons comment résoudre ce problème et en quoi est ce vraiment un problème.

 

A très vite

Ecrire un Commentaire

Commenter