sql >> Base de Datos >  >> RDS >> Mysql

¿Cuándo se devuelven las conexiones al grupo de conexiones con Spring JPA (Hibernate) Entity Manager?

No es nada complicado.

  1. Primero, debe comprender que el administrador de transacciones de Spring es solo una abstracción de administración de transacciones. En su caso, las transacciones reales ocurren en el nivel de conexión JDBC.

  2. Todo @Transactional las llamadas al método de servicio son interceptadas por TransactionInterceptor Aspecto.

  3. El TransactionIntreceptor delega la gestión de transacciones al AbstractPlatformTransactionManager implementación (JpaTransactionManager en su caso).

  4. JpaTransactionManager vinculará la transacción Spring en ejecución actual a un EntityManager, por lo que todos los DAO que participan en la transacción actual comparten el mismo contexto de persistencia.

  5. JpaTransactionManager simplemente usa el EntityManager API de transacciones para controlar transacciones:

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

La API de transacciones de JPA simplemente delega la llamada a los métodos subyacentes de compromiso/reversión de la conexión JDBC.

  1. Cuando se realiza la transacción (commit/rollback), org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction llamadas:

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

que desencadena un cierre de sesión de Hibernate (Entity Manager).

  1. Por lo tanto, la conexión JDBC subyacente también se activa para cerrarse:

     jdbcCoordinator.close();
    
  2. Hibernate tiene un controlador de conexión JDBC lógico:

     @Override
     public Connection close() {
         LOG.tracev( "Closing JDBC container [{0}]", this );
         if ( currentBatch != null ) {
         LOG.closingUnreleasedBatch();
             currentBatch.release();
         }
         cleanup();
         return logicalConnection.close();
     }
    
  3. La conexión lógica delega la llamada de cierre al proveedor de conexión actualmente configurado (DataSourceConnectionProvider en su caso), que simplemente llama al método close en la conexión JDBC:

     @Override
     public void closeConnection(Connection connection) throws SQLException {
          connection.close();
     }
    
  4. Como cualquier otra fuente de datos de agrupación de conexiones, el cierre de la conexión JDBC simplemente devuelve la conexión al grupo y no cierra la conexión de la base de datos física. Esto se debe a que la fuente de datos de la agrupación de conexiones devuelve un proxy de conexión JDBC que intercepta todas las llamadas y delega el cierre a la lógica de manejo de la agrupación de conexiones.

Tenga en cuenta que para las transacciones de RECURSO_LOCAL, también debe configurar hibernate.connection.provider_disables_autocommit propiedad si el autocommit La verificación fue deshabilitada por el grupo de conexiones. De esta forma, las conexiones de la base de datos se adquirirán de forma perezosa antes de ejecutar una consulta SQL o vaciar el contexto de persistencia.