Qu'est-ce que le chargement paresseux en veille prolongée?
Qu'est-ce que le chargement paresseux en Java? Je ne comprends pas le processus. Quelqu'un peut-il m'aider à comprendre le processus de chargement paresseux?
Vous devez vous connecter pour publier un commentaire.
Dire que vous avez un parent et que le parent a une collection d'enfants. Hibernate peut maintenant "lazy-load" les enfants, ce qui signifie qu'il ne fait pas de charge de tous les enfants lors du chargement de la mère. Au lieu de cela, il charge quand cela est demandé de le faire. Vous pouvez demander explicitement ou, ce qui est beaucoup plus commun, hibernate va charger automatiquement lorsque vous essayez d'accéder à un enfant.
Chargement différé peuvent aider à améliorer les performances de manière significative car, souvent, vous n'aurez pas besoin d'enfants et donc ils ne seront pas chargés.
Aussi méfiez-vous de la n+1-problème. Hibernate ne sera pas réellement charge tous les enfants lorsque vous accédez à la collection. Au lieu de cela, il se charge chaque enfant individuellement. Lors de l'itération sur la collecte, ce qui provoque une requête pour chaque enfant. Afin d'éviter cela, vous pouvez tromper hibernate dans le chargement de tous les enfants simultanément, par exemple en composant parent.getChildren().taille().
"Lazy loading" signifie que l'entité sera chargée seulement lorsque vous fait accède à l'entité pour la première temps.
La modèle est comme ceci:
Cela permet d'économiser le coût de préchargement/prefilling tous les entités dans un grand jeu de données à l'avance tout en vous après tout n'ont pas réellement besoin tous d'entre eux.
En veille prolongée, vous pouvez configurer paresseusement charger une collection d'enfant entités. Le réelle lazy loading est ensuite fait à l'intérieur des méthodes de la
PersistentSet
qui Hibernate utilise "sous le capot" pour attribuer la collection d'entités commeSet
.E. g.
.
Martin Fowler définit la Lazy Load modèle dans Les modèles de l'Architecture des Applications d'Entreprise en tant que tel:
Ainsi, lors du chargement d'un objet donné, l'idée est de ne pas désireux de charge l'objet(s) que vous ne pouvez pas utiliser immédiatement pour sauver leurs coûts. Au lieu de cela, l'objet connexe(s) seront chargés seulement lorsqu'il est utilisé.
Ce n'est pas un modèle spécifique à l'accès aux données et mise en veille prolongée, mais il est particulièrement utile dans des domaines tels que Hibernate et prend en charge le chargement paresseux de un-à-plusieurs associations et un seul point de associations un-à-un et plusieurs-à-un) également, sous certaines conditions.
Paresseux interaction est décrite plus en détail dans Chapitre 19 de Hibernate 3.0 Documentation de Référence.
Par défaut au chargement différé est vrai.Paresseux, des moyens de chargement lorsque la requête select est exécutée, elle n'affecteront pas la base de données. Il faudra attendre pour la fonction get-je.e lorsque nous demandions ensuite ,il va chercher de l'datbase.
par exemple:
Vous êtes un parent qui a un enfant avec beaucoup de jouets. Mais le problème actuel est donc à chaque fois que vous l'appelez (nous supposons que vous avez un garçon), il vient à vous avec tous ses jouets. Maintenant, c'est un problème, puisque vous ne voulez pas lui porter autour de ses jouets de tous les temps.
Donc, étant la justification parent, vous allez à droite de l'avant et de définir les jouets de l'enfant comme des PARESSEUX. Maintenant, chaque fois que vous l'appelez, il vient à vous sans ses jouets.
Chargement différé décide de charger les objets enfants pendant le chargement de l'Objet Parent.
Vous devez effectuer ce réglage respectifs hibernate fichier de mapping de la classe parent.
Lazy = true
(les moyens de ne pas charger de l'enfant)Par défaut, le chargement différé de l'enfant des objets est vrai.
Ce assurez-vous que l'enfant les objets ne sont pas chargés, sauf si elles sont explicitement invoqué dans la demande en appelant
getChild()
méthode des parents.Dans ce cas, hibernate questions d'une nouvelle base de données d'appel à la charge de l'enfant au moment degetChild()
est actully appelée sur l'objet Parent.Mais dans certains cas, vous avez besoin de charger les objets enfant lorsque le parent est chargé.
Il suffit de faire le paresseux=false hibernate et se charge de l'enfant lorsque le parent est chargé à partir de la base de données.
Exemple :
Si vous avez une TABLE ? EMPLOYÉ mappés à des Employés de l'objet et contient de l'Adresse objets.
Parent de la Classe : classe d'Employés,
Enfant de la classe : Classe d'Adresse
Dans le Employee.hbm.xml fichier
Dans la configuration ci-dessus.
Si
lazy="false"
: - lorsque vous chargez l'Employé de l'objet que du temps de l'enfant Adresse d'objet est également chargé et setAddresss() la méthode.Si vous appelez de l'employé.getAdress (), puis chargé des données de rendement.Pas de frais à la base de données.
Si
lazy="true"
:- Ce la configuration par défaut. Si vous n'avez?t mentionner ensuite hibernate envisager paresseux=true.lorsque vous chargez l'Employé de l'objet que du temps de l'enfant objet Adresse n'est pas chargé. Vous avez besoin d'un appel à la base de données pour obtenir l'adresse des objets.
Si vous appelez
employee.getAdress()
alors que le temps de la base de données de requête d'incendies et de retourner des résultats. Frais à la base de données.Dans un langage simple, c'est comme faire un gâteau, et vous aurez besoin de 5 à 10 ingrédients du réfrigérateur. Vous avez deux options, obtenir tous les ingrédients du frigo et de le mettre dans votre cuisine, plate-forme, ou d'apporter de l'élément que vous voulez quand vous en avez besoin.
De même, dans l'désireux de chargement, vous récupérez toutes les informations au sujet de haricot et de ses classes (pas d'enfant ou est-une relation mais a une relation, c'est à dire gâteau de farine, de lait, a de la crème, etc), et en cas de chargement paresseux, tout d'abord vous apporter seulement de son identifiant et de valeurs qui sont à venir à partir d'une même table (ingrédients nécessaires que d'abord vous aurez besoin dans votre bol dans le cas du gâteau). Toutes les informations à partir d'autres tables seront extraites en tant que de besoin/d'occasion.
Chargement Paresseux? Eh bien, cela signifie simplement que les enregistrements enfants ne sont pas récupérées immédiatement, mais automatiquement dès que vous essayez d'y accéder.
Paresseux réglage décide de charger les objets enfants pendant le chargement de l'Objet Parent.Vous devez effectuer ce réglage respectifs hibernate fichier de mapping de la classe parent.Lazy = true (ce qui signifie pas à la charge de l'enfant)Par défaut, le chargement différé de l'enfant des objets est vrai. Ce assurez-vous que l'enfant les objets ne sont pas chargés, sauf si elles sont explicitement invoqué dans la demande en appelant getChild() la méthode des parents.Dans ce cas, hibernate questions d'une nouvelle base de données d'appel à la charge de l'enfant au moment de getChild() est actully appelée sur l'objet Parent.Mais dans certains cas, vous avez besoin de charger les objets enfant lorsque le parent est chargé. Il suffit de faire le paresseux=false hibernate et se charge de l'enfant lorsque le parent est chargé à partir de la base de données.Exampleslazy=true (par défaut)Adresse à l'enfant de l'Utilisateur de la classe peuvent être faites paresseux si elle n'est pas fréquemment.lazy=falseBut vous pourriez avoir besoin de charger l'Auteur de l'objet Livre parent à chaque fois que vous faites affaire avec le livre de librairie en ligne.
Wikipedia
Lien de Chargement Différé de hibernate.org
Eh bien, il signifie simplement le chargement des données, vous avez besoin actuellement au lieu de chargement tas de données à la fois que vous ne l'utilisez pas maintenant. Rendant ainsi le chargement des applications plus rapidement que d'habitude.
Hiberante prend en charge la fonction d'initialisation différée pour les deux entités et des collections.
Hibernate charge du moteur uniquement les objets qui nous interroger pour ne pas que d'autres entités ou des collections.
lazy="false" par défaut de chargement d'initialisation mention pour le seul enfant est paresseux.en cas de vrai qui est le parent est en cours de chargement ne prend pas en charge l'enfant
Paresseux réglage décide de charger les objets enfants pendant le chargement de l'Objet Parent.Vous devez effectuer ce réglage respectifs hibernate fichier de mapping de la classe parent.Lazy = true (ce qui signifie pas à la charge de l'enfant)Par défaut, le chargement différé de l'enfant des objets est vrai.
Curieusement, aucun de réponses à parler de la façon dont il est réalisé par hibernate, derrière les écrans.
Chargement différé est un modèle de conception qui est effectivement utilisée en veille prolongée pour des raisons de performances qui implique des techniques suivantes.
1. Octet code d'instrumentation:
Améliore la base de la définition de la classe avec hibernate crochets d'intercepter tous les appels à cette entité de l'objet.
Fait soit lors de la compilation ou de l'exécution[load] temps
1.1 moment de la Compilation
Post moment de la compilation opération
Principalement par maven/ant plugins
1.2 moment de l'Exécution
Utilisation de bibliothèques comme javassist
2. Les procurations
L'objet entité qui Hibernent les rendements sont les proxy de type réel.
Voir aussi:
Javassist. Quelle est l'idée principale et où l'utilisation réelle?
Chargement différé permet de différer l'association de récupération ou d'avoir un meilleur contrôle sur les stratégies de chargement.
Lorsque vous utilisez AVIDE de chargement, vous définissez un plan de récupération des données qui ne peut être remplacé au moment de la requête, ce qui signifie que vous êtes limité à une décision que vous avez pris lors de la conception de votre modèle d'entité. Le Le chargement agressif est une odeur de code, parce que les stratégies de chargement est une requête de la politique en temps et il peut différer d'une entreprise cas d'utilisation à l'autre.
La stratégies de chargement est un aspect très important, car trop de chargement agressif peut entraîner de graves liées à la performance de questions.