Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Khi nào các kết nối được trả về nhóm kết nối với Trình quản lý thực thể Spring JPA (Hibernate)?

Nó không phức tạp chút nào.

  1. Trước tiên, bạn cần hiểu rằng trình quản lý giao dịch Spring chỉ là một phần tóm tắt quản lý giao dịch. Trong trường hợp của bạn, các giao dịch thực tế xảy ra ở cấp độ Kết nối JDBC.

  2. Tất cả @Transactional các cuộc gọi phương thức dịch vụ bị chặn bởi TransactionInterceptor Khía cạnh.

  3. TransactionIntreceptor ủy quyền quản lý giao dịch cho cấu hình hiện tại AbstractPlatformTransactionManager triển khai (JpaTransactionManager trong trường hợp của bạn).

  4. JpaTransactionManager sẽ ràng buộc giao dịch Spring đang chạy hiện tại với một EntityManager, vì vậy tất cả các DAO tham gia vào giao dịch hiện tại đều có chung một Ngữ cảnh bền vững.

  5. JpaTransactionManager chỉ cần sử dụng EntityManager API giao dịch để kiểm soát các giao dịch:

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

API giao dịch JPA chỉ cần ủy quyền cuộc gọi đến các phương thức cam kết / khôi phục kết nối JDBC cơ bản.

  1. Khi giao dịch được thực hiện (commit / rollback), org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction cuộc gọi:

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

kích hoạt Phiên ngủ đông (Trình quản lý thực thể) đóng.

  1. Do đó, kết nối JDBC cơ bản cũng được kích hoạt để đóng:

     jdbcCoordinator.close();
    
  2. Hibernate có một trình xử lý kết nối JDBC hợp lý:

     @Override
     public Connection close() {
         LOG.tracev( "Closing JDBC container [{0}]", this );
         if ( currentBatch != null ) {
         LOG.closingUnreleasedBatch();
             currentBatch.release();
         }
         cleanup();
         return logicalConnection.close();
     }
    
  3. Kết nối logic ủy quyền cuộc gọi đóng tới nhà cung cấp kết nối hiện được định cấu hình (DataSourceConnectionProvider trong trường hợp của bạn), chỉ gọi phương thức đóng trên kết nối JDBC:

     @Override
     public void closeConnection(Connection connection) throws SQLException {
          connection.close();
     }
    
  4. Giống như bất kỳ kết nối nào khác gộp chung DataSource, kết nối JDBC đóng chỉ đơn giản là trả kết nối về nhóm và không đóng kết nối cơ sở dữ liệu vật lý. Đó là bởi vì DataSource gộp kết nối trả về proxy Kết nối JDBC chặn tất cả các cuộc gọi và ủy quyền đóng cho logic xử lý nhóm kết nối.

Lưu ý rằng đối với các giao dịch RESOURCE_LOCAL, bạn cũng nên đặt hibernate.connection.provider_disables_autocommit thuộc tính nếu autocommit kiểm tra đã bị vô hiệu hóa bởi nhóm kết nối. Bằng cách này, các kết nối cơ sở dữ liệu sẽ được thu thập một cách lười biếng trước khi thực hiện truy vấn SQL hoặc xóa bối cảnh Persistence.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị kết quả truy vấn SQL trong php

  2. Cài đặt Percona XtraDB Cluster trên CentOS 7

  3. Hibernate, MySQL và bảng có tên Lặp lại - hành vi lạ

  4. MyISAM nhanh hơn bao nhiêu so với InnoDB?

  5. Làm thế nào để chạy một truy vấn MYSQL vào một thời gian cố định được xác định trước?