web-dev-qa-db-fra.com

Comment fonctionne session.clear () dans Hibernate

J'ai fait référence à de nombreux articles mais je ne sais toujours pas ce que session.clear Fait en hibernation.

Selon ce que j'ai rencontré jusqu'à présent, lorsque nous utilisons la sauvegarde/mise à jour par lots, comme indiqué ci-dessous:

Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Employee employee = new Employee(.....);
    session.save(employee);
    if( i % 50 == 0 ) { // Same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}
tx.commit();
session.close();

sesion.flush(); est utilisé pour vider la session force Hibernate à synchroniser l'état en mémoire de la session avec la base de données.

Question

1. Après avoir vidé la session, pourquoi est-il nécessaire de faire session.clear()? Est-ce vraiment nécessaire?

2. Est-ce que session.clear() effectuera une action de validation?

. Si session.clear() expulse tous les objets chargés, que se passe-t-il en interne pendant l'exécution des actions de validation et d'annulation?

12
PRATHAP S

Considérez la session comme un cache d'entités que vous avez déjà chargées depuis (ou persisté) dans la base de données depuis que vous avez commencé la transaction en cours.

  1. Session.clear N'est en aucun cas obligatoire, mais il est utile si vous effectuez beaucoup de chargement/sauvegarde d'entités au cours d'une même transaction, pour éviter de sortir d'une erreur de mémoire. Dans votre exemple, vous aurez 50 employee entités répliquées dans la session. Sans les méthodes flush et clear appelez toutes les 50 save(), vous auriez eu 100 000 entités répliquées dans la session (et non récupérables, car la session a un lien vers le entité).

  2. Session.clear N'effectuera ni validation ni restauration. Pas même un flush (d'où la raison pour laquelle vous devriez faire un vidage avant un Session.clear, Afin que hibernate génère des requêtes sql pour les mises à jour d'entités en attente.

  3. Les actions de restauration ou de validation ne sont pas effectuées du côté de l'application, mais dans la base de données: hibernate demandera simplement à la base de données de valider ou de restaurer (Hibernate peut déclencher une vidange avant l'action de validation, mais la vidange ne fait pas partie de la validation). L'action de validation n'accédera pas (et ne peut pas) accéder à la session. Il s'agit d'un mécanisme interne de base de données qui conservera (ou annulera) la modification des données effectuée grâce à toutes les requêtes SQL exécutées depuis le début de la transaction.

Exactement de la même manière, ouvrir une transaction en veille prolongée n'effectue pas beaucoup de choses: obtenir principalement une connexion db hors du pool et dire à la base de données de PAS auto_commit Suite aux requêtes SQL mais en attendant une commande de validation ou de restauration.

18
Thierry