Question à propos de la session Hibernate.flush()
Je veux me renseigner sur ce que fait la méthode flush dans le cas suivant:
for (int i = 0; i < myList.size(); i++) {
Car c = new Car( car.get(i).getId(),car.get(i).getName() );
getCurrentSession().save(c);
if (i % 20 == 0)
getCurrentSession().flush();
}
N'cela signifie que, après l'itération 20, le cache est vidé, puis le 20 lieu de la mémoire les objets sont réellement enregistrées dans la base de données ?
Quelqu'un peut-il m'expliquer ce qui va se passer lorsque la condition est vraie.
- Si personne ne répond vraiment à la question: est les données effectivement enregistrées dans la base de données ?...
Vous devez vous connecter pour publier un commentaire.
De la javadoc de
Session#flush
:En d'autres termes,
flush
indique à Hibernate pour exécuter les instructions SQL nécessaires pour synchroniser de la connexion JDBC de l'état avec l'état des objets détenus dans le niveau de la session de cache. Et la conditionif (i % 20 == 0)
fera se produire pour tous lesi
multiple de 20.Mais, encore, la nouvelle
Car
instances aura lieu à la session cache de niveau et, pour les grandesmyList.size()
, vous allez manger la totalité de la mémoire et, finalement, obtenir uneOutOfMemoryException
. Pour éviter cette situation, le modèle décrit dans la documentation est àflush
ETclear
la session à intervalles réguliers (de même taille que le JDBC taille de lot) pour conserver les modifications, puis détacher les instances de sorte qu'ils peuvent être des ordures collectées:La documentation mentionne dans le même chapitre comment définir l'JDBC de la taille des lots.
Voir aussi
Dépend de la façon dont la FlushMode est mis en place.
Dans la configuration par défaut Hibernate essaie de synchroniser avec la base de données à trois endroits.
Si le
FlushMode
est défini comme FlushMode.Manuel, le programmeur est d'informer hibernate qu'il/elle devra gérer quand pour transmettre les données à la base de données.Dans cette configurationle
session.flush()
appel d'enregistrer les instances d'objet de la base de données.Un
session.clear()
appel acutally peut être utilisée pour effacer la persistance contexte.flush()
se rincer explicitement. Période.Quelques pointeurs de la raison pour laquelle le renouvellement de l'eau doit correspondre à la taille des lots
Pour activer le traitement par lots, vous devez configurer le pilote jdbc de la taille des lots
Un piège courant en utilisant le dosage est si vous utilisez un objet de mise à jour ou d'insérer ce passe bien.Mais dans le cas où
vous êtes à l'aide de plusieurs objets qui entraîne de multiples insertions, mises à jour, puis vous aurez à définir explicitement le mécanisme de tri.
Par exemple
Ici dans ce cas
deux sql sont générés
1 pour insérer dans la voiture
1 pour insérer un accessoire
Pour le bon dosage, vous devrez définir le
de sorte que tous les inserts pour voiture est triée dans l'ensemble et tous les inserts de accessoires sont triés together.By ce faisant, vous aurez 20 inserts de tir dans un lot plutôt que 1 sql de tir à la fois.
Pour les différents sous une transaction, vous pouvez jeter un oeil à http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/event/def/AbstractFlushingEventListener.html
flush
n' PAS effacer des objets à partir du 1er niveau de cache.Oui toutes les 20 boucle, le sql est généré et exécuté pour les non sauvés des objets. Votre devrait également mettre en mode par lot de 20 à améliorer les performances.