4 votes

Hibernation extra paresseuse dangereuse ?

Existe-t-il des scénarios dans lesquels l'utilisation du lazy loading supplémentaire d'Hibernate peut être dangereuse ?

La documentation indique : "Extra-lazy collection fetching : les éléments individuels de la collection sont accédés à partir de la base de données en fonction des besoins. Hibernate essaie de ne pas récupérer l'ensemble de la collection en mémoire à moins que cela ne soit absolument nécessaire. Cette méthode convient aux collections de grande taille.

Je ne suis pas sûr de comprendre les implications de ce principe - cela signifie-t-il que je perdrai en performance si je déclare TOUTES les associations extra paresseuses, quelle que soit leur taille ? Existe-t-il une sorte de règle empirique sur l'utilisation du chargement extra paresseux ?

5voto

alf Points 5130

Il s'agit d'un problème courant à N+1, Qu'est-ce que SELECT N+1 ? multiplié. Pour ce qui est des performances, difficile à dire : très probablement, vous perdrez en performance. Mais peut-être pas.

Le problème est que si vous essayez d'itérer sur une collection très volumineuse, vous obtiendrez N+1 requêtes à la base de données : une pour l'ensemble de la collection, une par entité. Cela peut être bon ou mauvais, en fonction de la mise en cache et de la nature de vos données.

Mise à jour : le bon sens suggère de coder la chose la plus simple qui fonctionne (c'est-à-dire les paramètres par défaut), puis d'effectuer un profilage sous la rubrique utilisation réelle et de décider de l'approche à adopter une fois que vous disposez des données.

Il n'est pas vraiment utile de s'en tenir à une solution particulière dès le départ. Si vous n'avez besoin que d'un seul élément de la collection, c'est l'extraction rapide qui l'emportera. Peut-être. Si vous avez besoin de l'ensemble de la collection, la recherche extra-légère aura un impact sur les performances. En d'autres termes, si vous n'avez pas l'ensemble du domaine en cache, dans ce cas, vous n'avez pas à vous en soucier. En général.

En ce qui concerne l'API des critères et la déclaration explicite, cela va à l'encontre de l'objectif d'Hibernate : vous aimeriez que votre couche métier ne se préoccupe pas (aussi longtemps que cela est raisonnablement possible) des détails du mappage. Ainsi, tant que vous pouvez conserver les paramètres de mappage dans les mappages eux-mêmes, il est préférable de le faire. Comme toujours, YMMV.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X