Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quand les connexions sont-elles renvoyées au pool de connexions avec Spring JPA (Hibernate) Entity Manager ?

Ce n'est pas compliqué du tout.

  1. Tout d'abord, vous devez comprendre que le gestionnaire de transactions Spring n'est qu'une abstraction de la gestion des transactions. Dans votre cas, les transactions réelles se produisent au niveau de la connexion JDBC.

  2. Tous @Transactional les appels de méthode de service sont interceptés par le TransactionInterceptor Aspect.

  3. Le TransactionIntreceptor délègue la gestion des transactions au AbstractPlatformTransactionManager implémentation (JpaTransactionManager dans votre cas).

  4. JpaTransactionManager liera la transaction Spring en cours d'exécution à un EntityManager, de sorte que tous les DAO participant à la transaction en cours partagent le même contexte de persistance.

  5. JpaTransactionManager utilise simplement le EntityManager API de transaction pour contrôler les transactions :

     EntityTransaction tx = txObject.getEntityManagerHolder().getEntityManager().getTransaction();
     tx.commit();
    

L'API de transaction JPA délègue simplement l'appel aux méthodes de validation/annulation de la connexion JDBC sous-jacentes.

  1. Lorsque la transaction est terminée (commit/rollback), le org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction appels :

     transactionCoordinator().getTransactionContext().managedClose();
    

qui déclenche une fermeture de session Hibernate (Entity Manager).

  1. La connexion JDBC sous-jacente est donc également déclenchée pour être fermée :

     jdbcCoordinator.close();
    
  2. Hibernate a un handle de connexion logique JDBC :

     @Override
     public Connection close() {
         LOG.tracev( "Closing JDBC container [{0}]", this );
         if ( currentBatch != null ) {
         LOG.closingUnreleasedBatch();
             currentBatch.release();
         }
         cleanup();
         return logicalConnection.close();
     }
    
  3. La connexion logique délègue l'appel de fermeture au fournisseur de connexion actuellement configuré (DataSourceConnectionProvider dans votre cas), qui appelle simplement la méthode close sur la connexion JDBC :

     @Override
     public void closeConnection(Connection connection) throws SQLException {
          connection.close();
     }
    
  4. Comme toute autre connexion regroupant DataSource, la fermeture de connexion JDBC renvoie simplement la connexion au pool et ne ferme pas la connexion physique à la base de données. En effet, le pool de connexions DataSource renvoie un proxy de connexion JDBC qui intercepte tous les appels et délègue la fermeture à la logique de gestion du pool de connexions.

Notez que pour les transactions RESOURCE_LOCAL, vous devez également définir le hibernate.connection.provider_disables_autocommit propriété si le autocommit la vérification a été désactivée par le pool de connexion. De cette façon, les connexions à la base de données seront acquises paresseusement avant d'exécuter une requête SQL ou de vider le contexte de persistance.