Trong tham chiếu Hibernate, nó được ghi nhiều lần rằngLàm cách nào để ngắt phiên Hibernate?
Tất cả ngoại lệ do Hibernate ném đều gây tử vong. Điều này có nghĩa là bạn phải quay lại giao dịch cơ sở dữ liệu và đóng số
Session
hiện tại. Bạn không được phép tiếp tục làm việc với một sốSession
đã ném một ngoại lệ.
Một trong các ứng dụng cũ của chúng tôi sử dụng một phiên duy nhất để cập nhật/chèn nhiều bản ghi từ tệp vào bảng DB. Mỗi bản ghi cập nhật/chèn được thực hiện trong một giao dịch riêng biệt, sau đó được cam kết (hoặc quay lại trong trường hợp xảy ra lỗi). Sau đó, đối với bản ghi tiếp theo, một giao dịch mới được mở, và cứ thế. Nhưng cùng một phiên được sử dụng trong suốt toàn bộ quá trình, ngay cả khi một HibernateException
bị bắt ở giữa quá trình xử lý. Chúng tôi đang sử dụng Oracle 9i btw với Hibernate 3.24.sp1 trên JBoss 4.2.
Đọc phần trên trong sách, tôi nhận ra rằng thiết kế này có thể không thành công. Vì vậy, tôi đã tái cấu trúc ứng dụng để sử dụng một phiên riêng biệt cho mỗi bản cập nhật bản ghi. Trong một thử nghiệm đơn vị với một nhà máy sản xuất phiên giả lập, tôi có thể xác minh rằng nó đang yêu cầu một phiên mới cho mỗi lần cập nhật bản ghi. Càng xa càng tốt.
Tuy nhiên, chúng tôi không tìm thấy cách nào để tạo lại lỗi phiên trong khi kiểm tra toàn bộ ứng dụng (đây có phải là thử nghiệm căng thẳng btw hay không?). Chúng tôi đã nghĩ đến việc tắt người nghe DB nhưng chúng tôi nhận ra rằng ứng dụng đang giữ một loạt các kết nối mở cho DB và người nghe sẽ không ảnh hưởng đến các kết nối đó. (Đây là một ứng dụng web, được kích hoạt một lần mỗi đêm bởi một trình lên lịch, nhưng nó cũng có thể được kích hoạt thông qua trình duyệt.) Sau đó, chúng tôi đã cố gắng giết một số kết nối đó trong DB trong khi ứng dụng đang xử lý các bản cập nhật. cập nhật, nhưng sau đó ứng dụng vui vẻ tiếp tục cập nhật phần còn lại của các bản ghi. Rõ ràng Hibernate là đủ thông minh để mở lại các kết nối bị hỏng dưới mui xe mà không vi phạm toàn bộ phiên.
Vì vậy, điều này có thể không phải là vấn đề quan trọng, vì ứng dụng của chúng tôi dường như đủ mạnh ngay cả ở dạng ban đầu. Tuy nhiên, vấn đề vẫn tiếp tục làm tôi thất vọng. Tôi muốn biết:
- Trong hoàn cảnh nào không phiên Hibernate thực sự trở thành không sử dụng được sau một
HibernateException
bị ném (Cập nhật: và các triệu chứng là gì)? - Làm thế nào để tái tạo điều này trong một bài kiểm tra (Cập nhật: tốt hơn là trong tích hợp, thay vì kiểm tra đơn vị)?
- (thuật ngữ thích hợp cho một thử nghiệm như vậy là gì?)
Về 1), đây cũng là sự hiểu biết của tôi - vì vậy tôi rất vui vì tôi đã làm cho ứng dụng của chúng tôi mạnh mẽ hơn. Vấn đề trực tiếp là, làm thế nào để xác minh điều này trong một thử nghiệm độc lập? 2) âm thanh thú vị, vì điều này có thể được thực hiện mà không cần sửa đổi bản thân ứng dụng. –