JPA - Lot/mise à Jour en bloc - Quelle est la meilleure approche?
J'ai trouvé que l'APP ne prend pas en charge la mise à Jour suivante:
Update Person p set p.name = :name_1 where p.id = :id_1,
p.name = :name_2 where p.id = :id_2,
p.name = :name_3 where p.id = :id_3
....
//It could go on, depending on the size of the input. Could be in 100s
J'ai donc deux options:
Option 1:
Query q = em.createQuery("Update Person p set p.name = :name where p.id = :id");
For ( int x=0; PersonsList.length; x++ ) {
//add name and id parameters
em.executeUpdate();
}
Questions:
- Est-ce tout ce qui est nécessaire pour la mise à jour par Lot? Autre chose à ajouter?
J'ai mishibernate.jdbc.batch_size", "20"
- Est l'optimiste verrouiller cette option est activée par défaut? (Je n'ai pas @Version dans mon entité)
- Que dois-je faire pour appliquer le Verrouillage Optimiste, si ce n' @Version?
Option 2:
Construire une requête unique en utilisant soit Select Case
syntaxe ou avec Criteria API
Questions:
- Le dosage encore arriver ici? (En une seule requête)
- Est-ce mieux que la 1ère approche en termes de performance?
- Quoi l'approche recommandée en dehors de ces deux options? Toute autre meilleure approche?
Allez, voulez-vous vraiment exécuter un bloc de 3 lignes? en vrac provoque une Intention de verrouillage sur la cible de la table et il n'est pas bon,, il suffit de commencer le traitement par lots par
Pas de. Sa dynamique. J'ai juste montré 3 dans l'exemple :-). Il pourrait être 100s.
il charge copain, ce genre de DB utilisez-vous? et combien de fois voulez-vous exécuter cette requête(s)? mais si vous me demandez, je préfère DB préfèrent façon, et l'exécuter en parallèle avec une priorité basse
Nous utilisons Oracle. Ses un Webservice appel.
Eh bien oui, mon pote, il va définir la taille du lot automatiquement et que vous le définissez comme 20, vous avez 20 appels pour chaque lot, mais il n'est pas recommandé pour les charges lourdes, généralement
em.begin()
et appellent tous les DMLs et enfin 'em.commit();'Pas de. Sa dynamique. J'ai juste montré 3 dans l'exemple :-). Il pourrait être 100s.
il charge copain, ce genre de DB utilisez-vous? et combien de fois voulez-vous exécuter cette requête(s)? mais si vous me demandez, je préfère DB préfèrent façon, et l'exécuter en parallèle avec une priorité basse
Nous utilisons Oracle. Ses un Webservice appel.
Eh bien oui, mon pote, il va définir la taille du lot automatiquement et que vous le définissez comme 20, vous avez 20 appels pour chaque lot, mais il n'est pas recommandé pour les charges lourdes, généralement
batch_size
la valeur est comprise entre 10 et 35 (personnes à charge), pour les charges très lourdes db préférez 🙂OriginalL'auteur Kevin Rave | 2013-07-11
Vous devez vous connecter pour publier un commentaire.
Dans votre question titre, vous avez mentionné mise à Jour en bloc et de les Supprimer, mais vous avez réellement besoin de traitement par lots ce moment.
Bulk Update et Delete sont nécessaires lorsque vous souhaitez mettre à JOUR/SUPPRIMER des lignes qui correspondent à tous les mêmes critères de filtrage qui peut être exprimée dans la clause where.
Ici, vous avez besoin de JDBC mises à jour par lot. Comme expliqué dans cet article, vous devez définir les paramètres suivants de la configuration de la propriété:
Si vous faites cela, vous pouvez simplement mettre à jour les entités Hibernate et lot la mise à JOUR des déclarations pour vous.
L'Option 1 n'est pas très utile, car il va générer N mise à JOUR des déclarations qui ne peuvent pas être groupés.
L'Option 2 n'est pas très utile car il permet de générer une requête très complexe, dont le Plan d'Exécution est probablement plus complexe que l'exécution de tout dans un simple groupées instruction de mise à JOUR.
Donc, faites comme ceci:
Si vous avez plusieurs de ces entités, l'utilisation de la pagination, comme expliqué dans cet article.
OriginalL'auteur Vlad Mihalcea
Si vous allez utiliser le traitement par lots voir ce chapitre de la documentation hibernate
La batch_size est plus de l'optimisation de la mémoire de l'optimisation de la requête, la requête est de rester le même, mais vous pouvez également réduire l'aller-retour par la pleine utilisation de votre mémoire. vous devez flush() et clear() chaque fois que nécessaire dépend de la configuration de batch_size.
mais tout de même . .
Mise à jour en 1 déclaration est beaucoup plus rapide que de mettre à jour plusieurs énoncé, donc si vous :
valeur
Alors vous pouvez envisager de créer simplement de requête native que les requêtes hql.
comme je l'ai dit batch_size est juste une question de gestion de la mémoire, de sorte que vous pouvez commettre des dizaines de milliers de lignes dans un commit sans avoir un OutOfMemoryException. donc, si votre requête native pouvez faire ce que vous avez besoin, sans exception OutOfMemoryException, vous pouvez envisager de l'utiliser, mais si vous devez utiliser des requêtes HQL à la place. Mais je pense que SQL ne pas avoir OutOfMemoryException problème parce que hibernate juste enregistrer persisté les objets de la session au niveau du cache.
OriginalL'auteur Angga
Vous pouvez mettre à jour une liste d'objet sans itérer sur tous les la collection.
OriginalL'auteur OJVM