sql >> Databáze >  >> RDS >> Mysql

Kdy jsou připojení vrácena do fondu připojení pomocí Spring JPA (Hibernate) Entity Manager?

Není to vůbec složité.

  1. Nejprve musíte pochopit, že správce transakcí Spring je pouze abstrakcí správy transakcí. Ve vašem případě se skutečné transakce odehrávají na úrovni připojení JDBC.

  2. Vše @Transactional volání metody služby jsou zachyceny TransactionInterceptor Poměr.

  3. TransactionIntreceptor deleguje správu transakcí na aktuálně nakonfigurovanýAbstractPlatformTransactionManager implementace (JpaTransactionManager ve vašem případě).

  4. JpaTransactionManager sváže aktuální probíhající jarní transakci s EntityManager, takže všechny DAO účastnící se aktuální transakce sdílejí stejný trvalý kontext.

  5. JpaTransactionManager jednoduše používá EntityManager Transaction API pro řízení transakcí:

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

JPA Transaction API jednoduše deleguje volání na základní metody potvrzení/vrácení připojení JDBC.

  1. Po dokončení transakce (commit/rollback) se org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction volání:

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

což spustí zavření relace Hibernate (Entity Manager).

  1. Podkladové připojení JDBC je proto spuštěno k uzavření také:

     jdbcCoordinator.close();
    
  2. Hibernate má logický popisovač připojení JDBC:

     @Override
     public Connection close() {
         LOG.tracev( "Closing JDBC container [{0}]", this );
         if ( currentBatch != null ) {
         LOG.closingUnreleasedBatch();
             currentBatch.release();
         }
         cleanup();
         return logicalConnection.close();
     }
    
  3. Logické připojení deleguje zavřít volání na aktuálně nakonfigurovaného poskytovatele připojení (DataSourceConnectionProvider ve vašem případě), který jednoduše zavolá metodu close na připojení JDBC:

     @Override
     public void closeConnection(Connection connection) throws SQLException {
          connection.close();
     }
    
  4. Stejně jako u jakéhokoli jiného DataSource sdružujícího připojení, uzavření připojení JDBC jednoduše vrátí připojení k fondu a neuzavře fyzické připojení k databázi. Důvodem je to, že DataSource sdružování připojení vrací proxy připojení JDBC, které zachycuje všechna volání a deleguje uzavření na logiku zpracování fondu připojení.

Pamatujte, že pro transakce RESOURCE_LOCAL byste měli také nastavit hibernate.connection.provider_disables_autocommit vlastnost if autocommit kontrola byla zakázána fondem připojení. Tímto způsobem budou databázová připojení získána líně před provedením SQL dotazu nebo vyprázdněním Persistence Context.




  1. INSERT 10 milionů dotazů do 10 minut v Oracle?

  2. ORA-01438:hodnota větší než specifikovaná přesnost povolená pro tento sloupec při vkládání 3

  3. Nejrychlejší způsob, jak provádět vnořené hromadné vkládání s použitím scope_identity()?

  4. CROSS JOIN vs INNER JOIN v SQL