2015-11-20 13 views
5

Tôi đang trong quá trình tối ưu hóa một thuật toán, và tôi nhận thấy rằng Hibernate tạo và phát hành các câu lệnh cập nhật lặp đi lặp lại thay vì sử dụng lại chúng. Đây là tất cả từ cùng một truy vấn.Spring Hibernate, tránh các câu lệnh đăng ký và đóng lặp lại

15:57:31,589 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,591 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,592 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,592 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 
15:57:31,594 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,595 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,596 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,596 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 
15:57:31,597 TRACE [.JdbcCoordinatorImpl]:371 - Registering statement [sql : 'update ... 
15:57:31,599 TRACE [.JdbcCoordinatorImpl]:412 - Releasing statement [sql : 'update ... 
15:57:31,600 TRACE [.JdbcCoordinatorImpl]:525 - Closing prepared statement [sql : 'update ... 
15:57:31,601 TRACE [.JdbcCoordinatorImpl]:278 - Starting after statement execution processing [ON_CLOSE] 

Phương pháp chính của thuật toán có chú thích @Scope@Transactional. Hành vi mong đợi là, nếu có gì sai, các bản cập nhật của thuật toán là ROLLBACK.

Bên dưới, thuật toán sử dụng @Service có một số khác nhau @Scope và cũng là @Transactional. Dịch vụ này là dịch vụ sử dụng Hibernate để cập nhật cơ sở dữ liệu, với session.update(entity). Tài liệu nói rằng, theo mặc định, các giao dịch lồng nhau sử dụng lại giao dịch nếu nó tồn tại.

  • Xác nhận đó có chính xác không?
  • Thay đổi phạm vi có thể tạo ra sự cố không?
  • Làm cách nào tôi có thể sử dụng lại Hibernate tuyên bố trong giao dịch?

Cám ơn sự quan tâm của bạn

Trả lời

5

hiểu biết của bạn là đúng. Phạm vi không liên quan đến cách các giao dịch được nhân giống, Spring nên bao bọc các bean của bạn với các proxy kiểm soát các giao dịch bất kể phạm vi.

Không có cách nào để sử dụng lại câu lệnh khi sử dụng Hibernate. Ngay cả khi viết mã JDBC theo cách thủ công, nó không được khuyến khích tiếp cận, do sự vướng víu mã mà các lực tiếp cận như vậy. Câu trả lời chung cho điều này là sử dụng bộ nhớ cache của câu lệnh đã chuẩn bị trên nhóm kết nối JDBC. Ví dụ với nhóm Apache DBCP, bạn có thể sử dụng poolPreparedStatementsmaxOpenPreparedStatements để kiểm soát điều đó. Hồ bơi đi kèm với máy chủ ứng dụng có cài đặt tương tự.

Các vấn đề liên quan