Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kapan koneksi dikembalikan ke kumpulan koneksi dengan Manajer Entitas Spring JPA (Hibernate)?

Ini tidak rumit sama sekali.

  1. Pertama, Anda perlu memahami bahwa manajer transaksi Spring hanyalah abstraksi manajemen transaksi. Dalam kasus Anda, transaksi sebenarnya terjadi di tingkat Koneksi JDBC.

  2. Semua @Transactional panggilan metode layanan dicegat oleh TransactionInterceptor Aspek.

  3. TransactionIntreceptor mendelegasikan manajemen transaksi ke konfigurasi saat iniAbstractPlatformTransactionManager implementasi (JpaTransactionManager dalam kasus Anda).

  4. JpaTransactionManager akan mengikat transaksi Spring yang berjalan saat ini ke EntityManager, sehingga semua DAO yang berpartisipasi dalam transaksi saat ini memiliki Konteks Persistence yang sama.

  5. JpaTransactionManager cukup gunakan EntityManager API Transaksi untuk mengendalikan transaksi:

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

JPA Transaction API hanya mendelegasikan panggilan ke metode commit/rollback Koneksi JDBC yang mendasarinya.

  1. Ketika transaksi selesai (commit/rollback), org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction panggilan:

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

yang memicu penutupan Sesi Hibernasi (Pengelola Entitas).

  1. Oleh karena itu, koneksi JDBC yang mendasarinya juga dipicu untuk ditutup:

     jdbcCoordinator.close();
    
  2. Hibernate memiliki pegangan koneksi JDBC logis:

     @Override
     public Connection close() {
         LOG.tracev( "Closing JDBC container [{0}]", this );
         if ( currentBatch != null ) {
         LOG.closingUnreleasedBatch();
             currentBatch.release();
         }
         cleanup();
         return logicalConnection.close();
     }
    
  3. Koneksi logis mendelegasikan panggilan dekat ke penyedia koneksi yang saat ini dikonfigurasi (DataSourceConnectionProvider dalam kasus Anda), yang hanya memanggil metode tutup pada koneksi JDBC:

     @Override
     public void closeConnection(Connection connection) throws SQLException {
          connection.close();
     }
    
  4. Seperti dataSource pooling koneksi lainnya, koneksi JDBC close hanya mengembalikan koneksi ke pool dan tidak menutup koneksi database fisik. Itu karena kumpulan koneksi DataSource mengembalikan proxy Koneksi JDBC yang memotong semua panggilan dan mendelegasikan penutupan logika penanganan kumpulan koneksi.

Perhatikan bahwa untuk transaksi RESOURCE_LOCAL, Anda juga harus menyetel hibernate.connection.provider_disables_autocommit properti jika autocommit cek dinonaktifkan oleh kumpulan koneksi. Dengan cara ini, koneksi database akan diperoleh dengan lambat sebelum mengeksekusi kueri SQL atau menghapus Konteks Persistensi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aplikasi Web PHP:pertanyaan praktik terbaik desain database mysql

  2. MySQL Sum() beberapa kolom

  3. doktrin2 dan group_concat

  4. MySQL 'PERBARUI PADA KUNCI DUPLICATE' tanpa kolom unik?

  5. Pemicu MYSQL:JSON_SEARCH nilai integer dalam array json bilangan bulat