2011-11-14 24 views
8

Tôi đang gỡ lỗi ứng dụng web của mình. Nó được cấu hình để tạo ra một bean DataSourceTransactionManager và cũng là một bean HibernateTransactionManager khi khởi động. Đây không phải là cố ý nhưng do sự phụ thuộc của bên thứ ba gây ra. Hiệu ứng có vẻ lành tính. Những gì tôi nhìn thấy thông qua gỡ lỗi là khi chúng ta tồn tại một đối tượng thông qua một DAO Hibernate dựa trên - DataSourceTransactionManager được gọi và không phải là HibernateTransactionManager (cả hai đều được gọi là 'transactionManager'). Spring Javadoc ngụ ý (tôi nghĩ rằng, đọc lại nó bây giờ) điều này là tốt cho các nguồn lực địa phương - đó là tình hình của chúng tôi. I E. nó không phải là một môi trường dựa trên JTA phân tán.Có thể sử dụng DataSourceTransactionManager cho ORM persistence thay vì HibernateTransactionManager không?

Câu hỏi của tôi là - có bất kỳ tác động tiêu cực nào của việc không sử dụng HibernateTransactionManager cho sự kiên trì dựa trên ORM hay không. Tôi có thể thay đổi cấu hình để làm cho HibernateTransactionManager được sử dụng thông qua một vòng loại trên chú thích @Transactional trên DAO của chúng tôi.

Mọi thứ hoạt động tốt trong thử nghiệm đơn vị đơn giản, thiết lập thử nghiệm tích hợp nhưng tôi lo ngại về việc mở rộng quy mô sản xuất khi chúng tôi có hàng nghìn người dùng và mức độ đồng thời cao.

TIA, hy vọng điều này không quá tối nghĩa.

Spring 3.0.x BTW.

Đây là tài liệu Spring 3.1.

Sec 11.9 "Giải pháp cho vấn đề thường gặp".

Sử dụng đúng triển khai PlatformTransactionManager dựa trên lựa chọn công nghệ và yêu cầu giao dịch của bạn.

Trả lời

6

Điều này sẽ đánh tôi là sai và sẽ gây ra sự cố. Nếu không có trình quản lý txn ngủ đông, tất cả các cuộc gọi được thực hiện cho HibernateOperations sẽ nằm ngoài một giao dịch và trên một phiên riêng biệt, có thể sử dụng tự động cam kết. Vì vậy, nó có thể xuất hiện rằng tất cả mọi thứ là tốt khi một lỗi xảy ra, bạn có thể tìm thấy những thay đổi bạn mong đợi sẽ được cuộn lại không.

Thử cách sau để kiểm tra

  • bắt đầu tran
  • tiết kiệm một cái gì đó
  • ném ngoại lệ
  • cam

Kiểm tra xem 'cái gì' xuất hiện trong DB hay không.

kiểm tra khác sẽ là

  • bắt đầu tran một cái gì đó
  • tải
  • truy cập một mối quan hệ với một đối tượng từ một cái gì đó và truy cập vào một tài sản (không phải là pk) của đối tượng có liên quan này

Bạn có thể thấy cuộc gọi cuối cùng gây ra một ngoại lệ vì phiên không được giữ mở khỏi tải bởi vì txn kèm theo không được quản lý bởi trình quản lý txn ngủ đông.

+0

+1 Hmm. hấp dẫn. cảm ơn bạn. sẽ thử một trong các thử nghiệm này. Những gì tôi thấy là các cuộc gọi DAO đang diễn ra trong các giao dịch, và các cuộc gọi DAO getSession() - vì vậy Spring SessionFactoryUtils tay trở lại một phiên mới và tất cả có vẻ tốt. nhưng như bạn nói - tần suất chúng ta nhớ để nghỉ ngơi. –

+4

Đẹp nhất. Tôi đã thử nghiệm này. Gây ra một ngoại lệ sau khi lưu, với Hibernate tx mgr tiết kiệm được cuộn lại. Với DataSourceTransactionManager nó không phải. –

+0

Bạn có thể cung cấp tài liệu chính thức hỗ trợ từ của bạn "Không có trình quản lý txn ngủ đông tất cả các cuộc gọi được thực hiện cho HibernateOperations sẽ ở bên ngoài một giao dịch và trên một phiên riêng biệt"? Tôi đang sử dụng DataSourceTransactionManager + Hibernate. – DerekY

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