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:

  1. Est-ce tout ce qui est nécessaire pour la mise à jour par Lot? Autre chose à ajouter?
    J'ai mis hibernate.jdbc.batch_size", "20"
  2. Est l'optimiste verrouiller cette option est activée par défaut? (Je n'ai pas @Version dans mon entité)
  3. 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:

  1. Le dosage encore arriver ici? (En une seule requête)
  2. Est-ce mieux que la 1ère approche en termes de performance?
  3. 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 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