Mysql
 sql >> база данни >  >> RDS >> Mysql

Кога връзките се връщат към пула за връзки с Spring JPA (хибернация) Entity Manager?

Изобщо не е сложно.

  1. Първо, трябва да разберете, че мениджърът на транзакции Spring е само абстракция за управление на транзакции. Във вашия случай действителните транзакции се случват на ниво JDBC Connection.

  2. Всички @Transactional извикванията на метод на услугата се прихващат от TransactionInterceptor Аспект.

  3. TransactionIntreceptor делегира управлението на транзакциите на текущия конфигуриранAbstractPlatformTransactionManager реализация (JpaTransactionManager във вашия случай).

  4. JpaTransactionManager ще свърже текущата текуща транзакция Spring към EntityManager, така че всички DAO, участващи в текущата транзакция, споделят един и същ контекст на постоянство.

  5. JpaTransactionManager просто използва EntityManager API за транзакции за контролиране на транзакции:

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

JPA Transaction API просто делегира извикването към основните методи за записване/връщане на JDBC връзка.

  1. Когато транзакцията е извършена (commit/rollback), org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction обаждания:

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

което задейства затваряне на сесия в хибернация (Entity Manager).

  1. Следователно основната JDBC връзка също се задейства, за да бъде затворена:

     jdbcCoordinator.close();
    
  2. Hibernate има логическа дръжка за JDBC връзка:

     @Override
     public Connection close() {
         LOG.tracev( "Closing JDBC container [{0}]", this );
         if ( currentBatch != null ) {
         LOG.closingUnreleasedBatch();
             currentBatch.release();
         }
         cleanup();
         return logicalConnection.close();
     }
    
  3. Логическата връзка делегира извикването за затваряне към текущо конфигурирания доставчик на връзка (DataSourceConnectionProvider във вашия случай), който просто извиква метода за затваряне на JDBC връзката:

     @Override
     public void closeConnection(Connection connection) throws SQLException {
          connection.close();
     }
    
  4. Както всеки друг източник на данни за обединяване на връзки, затварянето на JDBC връзката просто връща връзката към пула и не затваря физическата връзка с базата данни. Това е така, защото DataSource за събиране на връзки връща прокси JDBC Connection, който прихваща всички повиквания и делегира затварянето на логиката за обработка на пула за връзки.

Имайте предвид, че за транзакции RESOURCE_LOCAL трябва също да зададете hibernate.connection.provider_disables_autocommit свойство, ако autocommit проверката беше деактивирана от пула за връзки. По този начин връзките към базата данни ще бъдат придобити мързеливо, преди да се изпълни SQL заявка или да се прочисти контекста на постоянство.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql рекурсия?

  2. SELECT INTO не работи

  3. Как да използвате тригер в MySql, за да направите външен ключ

  4. Достъпът е отказан за потребител 'root'@'localhost' с PHPMyAdmin

  5. MySQL пълнотекстово търсене винаги има 0 резултата?