Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Kiedy połączenia są zwracane do puli połączeń za pomocą Spring JPA (Hibernate) Entity Manager?

To wcale nie jest skomplikowane.

  1. Po pierwsze, musisz zrozumieć, że menedżer transakcji Spring jest tylko abstrakcją zarządzania transakcjami. W Twoim przypadku faktyczne transakcje odbywają się na poziomie połączenia JDBC.

  2. Wszystkie @Transactional wywołania metod usług są przechwytywane przez TransactionInterceptor Aspekt.

  3. TransactionIntreceptor deleguje zarządzanie transakcjami do aktualnie skonfigurowanejAbstractPlatformTransactionManager implementacja (JpaTransactionManager w twoim przypadku).

  4. JpaTransactionManager powiąże bieżącą działającą transakcję Spring z EntityManager, więc wszystkie DAO uczestniczące w bieżącej transakcji współdzielą ten sam kontekst trwałości.

  5. JpaTransactionManager po prostu używa EntityManager Transaction API do kontrolowania transakcji:

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

Interfejs API transakcji JPA po prostu deleguje wywołanie do podstawowych metod zatwierdzania/wycofywania połączenia JDBC Connection.

  1. Po zakończeniu transakcji (zatwierdzenie/wycofanie), org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction połączenia:

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

co wyzwala zamknięcie sesji hibernacji (menedżera jednostek).

  1. Bazowe połączenie JDBC jest zatem również wyzwalane do zamknięcia:

     jdbcCoordinator.close();
    
  2. Hibernate ma logiczny uchwyt połączenia JDBC:

     @Override
     public Connection close() {
         LOG.tracev( "Closing JDBC container [{0}]", this );
         if ( currentBatch != null ) {
         LOG.closingUnreleasedBatch();
             currentBatch.release();
         }
         cleanup();
         return logicalConnection.close();
     }
    
  3. Połączenie logiczne deleguje wywołanie zamknięcia do aktualnie skonfigurowanego dostawcy połączenia (DataSourceConnectionProvider w twoim przypadku), która po prostu wywołuje metodę zamykania połączenia JDBC:

     @Override
     public void closeConnection(Connection connection) throws SQLException {
          connection.close();
     }
    
  4. Podobnie jak w przypadku każdego innego DataSource w puli połączeń, zamknięcie połączenia JDBC po prostu zwraca połączenie do puli i nie zamyka fizycznego połączenia z bazą danych. Dzieje się tak, ponieważ DataSource puli połączeń zwraca serwer proxy połączenia JDBC, który przechwytuje wszystkie wywołania i deleguje zamykanie do logiki obsługi puli połączeń.

Pamiętaj, że w przypadku transakcji RESOURCE_LOCAL należy również ustawić hibernate.connection.provider_disables_autocommit właściwość, jeśli autocommit kontrola została wyłączona przez pulę połączeń. W ten sposób połączenia z bazą danych będą uzyskiwane leniwie przed wykonaniem zapytania SQL lub opróżnieniem kontekstu trwałości.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instalowanie sterownika QMYSQL

  2. GRUPA MySQL WEDŁUG... MIEJĄCYCH różne wartości w tym samym polu

  3. Resetowanie hasła ROOT w MySQL 5.6

  4. Importuj pojedynczą bazę danych z --all-databases dump

  5. Dlaczego nie mogę wstawić 10 cyfr, gdy moja kolumna to INT(10)