Comment dynamic-update= "true" fonctionne en interne en veille prolongée?
Donc, je comprends que la définition de cet attribut dynamic-update=true fait, j'.e il considère uniquement les champs qui ont été modifiés et omet le travail de définition des valeurs null pour les autres champs. Enregistrement d'une surcharge, une bonne performance.
Demander par curiosité: Comment hibernate venir à savoir ce que tous les champs ont été modifiés? Faut-il faire une comparaison du résultat généré par la requête select de la première base de données avant la mise à feu d'une requête de mise à jour? En supposant que oui, alors n'est-ce pas la comparaison une surcharge de performance?
Corrigez-moi si je me trompe. Merci à l'avance!
- étrange n'est-ce pas? personne n'a été en mesure de trouver un similaire/ double question avant, quand j'ai attendu presque 2 mois à essayer de chercher des réponses de partout et enfin le poster ici, seulement pour trouver des gens qui essaient de vous tirer vers le bas et de réduire vos points de réputation! Telle une mauvaise chose à propos de gens ici! Félicitations à vous pour que! Souhaitez vous aviez trouvé ce lien avant, je n'aurais pas mis dans de tels efforts!!!
- Ce qui est étrange? J'étais à la recherche sur cette question, a trouvé deux questions similaires, l'un dans le lien et celui-ci. J'ai regardé les dates et votre venue après, sinon je serais battant pavillon de l'autre. Quel est le problème? C'est juste un indicateur comme en double, pas un downvote ou d'une infraction.
Vous devez vous connecter pour publier un commentaire.
Donc après presque 2 mois d'attente j'ai finalement été en mesure de tirer cette conclusion proposée comme une réponse à ma propre question avec l'aide de différentes sources:
1.) Lors de l'utilisation de
dynamic-update
, Hibernate doit générer les requêtes SQL correspondant de la chaîne à chaque fois et il y a donc un coût de performance sur les Hibernatecôté. En d'autres termes, il existe un compromis entre la surcharge sur le côté de la base de données et sur les Hibernate côté.
2.) Hibernate met en cache le réel SÉLECTIONNER, INSÉRER et mettre à JOUR des chaînes SQL pour chaque entité. Il en résulte de ne pas avoir à re-créer ces déclarations chaque fois que vous voulez
trouver, conserver ou de mettre à jour une entité.Cependant, lors de l'utilisation de
dynamic-update
, Hibernate doit générer les requêtes SQL correspondant cordes à chaque fois.Il en résulte un coût de performance sur les Hibernate côté.
3.) Utile lorsqu'il est appliqué à un très petit & tableau simple comme il y a un gain de performance significatif à l'aide de cette annotation.
Un scénario plus réaliste, plus larges tables à l'aide d'une base de données distante, augmente les performances peuvent être plus prononcées. Bien sûr, le kilométrage que vous sortir de cela
varier la plupart des colonnes doivent être mis à jour.
4.) Le
@DynamicUpdate annotation/dynamic-update=true
est utilisée pour indiquer que la mise à JOUR de l'instruction SQL doit être généré à chaque fois qu'une entité est modifié.Par défaut, Hibernate utilise le cache de mise à JOUR de l'énoncé qui définit toutes les colonnes de la table. Lorsque l'entité est annotée avec les
@DynamicUpdate
annotation,la PreparedStatement va inclure uniquement les colonnes dont les valeurs ont été modifiées.
Pourrait être résumés comme suit:
Crédits: ORM Hibernate 5.2.7.Final Guide De L'Utilisateur,http://memorynotfound.com/hibernate-dynamic-update-attriburte-example/
https://stackoverflow.com/a/3405560/1004631
P. S.: est Également vrai pour les
dynamic-insert=true/@DynamicInsert
annotationDonc, d'après ce que j'ai compris, le dynamic-insert=true, rend SQL inclut pas les propriétés modifiées.
Exemple: si tu vas à jour [nom] attribut à partir d'une ligne dans la table [Utilisateur] et dynamic-insert est définie sur true, puis le SQL généré sera quelque chose autour de cela:
D'autre, si dynamic-insert est définie sur false, le SQL suivante est générée: