Khi nào sử dụng Stateful session bean thay vì Stateless session bean?


82

Một bean phiên trạng thái được định nghĩa như sau:

Stateful Session Beans Trạng thái của một đối tượng bao gồm các giá trị của các biến thể hiện của nó. Trong một bean phiên trạng thái, các biến thể hiện đại diện cho trạng thái của một phiên client-bean duy nhất. Bởi vì máy khách tương tác (“nói chuyện”) với bean của nó, trạng thái này thường được gọi là trạng thái đàm thoại.

Một bean phiên không trạng thái được định nghĩa như sau:

Đậu phiên không trạng thái Một phiên không trạng thái không duy trì trạng thái đàm thoại với máy khách. Khi một ứng dụng khách gọi các phương thức của một bean không trạng thái, các biến thể hiện của bean có thể chứa một trạng thái cụ thể cho ứng dụng đó, nhưng chỉ trong khoảng thời gian của lời gọi. Khi phương thức kết thúc, không nên giữ lại trạng thái dành riêng cho máy khách. Tuy nhiên, khách hàng có thể thay đổi trạng thái của các biến thể hiện trong các bean không trạng thái được gộp chung và trạng thái này được giữ cho lần gọi tiếp theo của bean không trạng thái được gộp chung. Ngoại trừ trong khi gọi phương thức, tất cả các phiên bản của bean không trạng thái đều tương đương nhau, cho phép vùng chứa EJB gán một cá thể cho bất kỳ máy khách nào. Đó là, trạng thái của một phiên không trạng thái sẽ áp dụng cho tất cả các máy khách.

Lợi thế của việc sử dụng một phiên đậu trạng thái so với một phiên đậu trạng thái như sau:

Bởi vì phiên không trạng thái có thể hỗ trợ nhiều máy khách, chúng có thể cung cấp khả năng mở rộng tốt hơn cho các ứng dụng yêu cầu số lượng lớn máy khách. Thông thường, một ứng dụng yêu cầu ít đậu phiên không trạng thái hơn so với đậu phiên trạng thái để hỗ trợ cùng một số lượng khách hàng.

Vì vậy, câu hỏi xuất hiện trong đầu là khi nào thì nên sử dụng stateful session bean? Theo hiểu biết ngây thơ của tôi về vấn đề này, người ta nên sử dụng một session bean không trạng thái khi có thể.

Những gì sẽ là các ứng cử viên trong đó một người nên sử dụng bean phiên trạng thái? Bất kỳ ví dụ tốt?

Phiên đậu


Câu trả lời:


150

Trước tiên, bạn phải hiểu cách các bean được tạo và xử lý trên máy chủ.

Đối với các phiên không trạng thái , máy chủ có thể duy trì một lượng phiên bản khác nhau trong một nhóm. Mỗi khi khách hàng yêu cầu một bean không trạng thái như vậy (ví dụ như thông qua một phương thức), một cá thể ngẫu nhiên được chọn để phục vụ yêu cầu đó. Điều đó có nghĩa là nếu máy khách thực hiện hai yêu cầu tiếp theo thì có thể hai trường hợp khác nhau của bean không trạng thái sẽ phục vụ các yêu cầu. Trên thực tế, không có trạng thái đàm thoại giữa hai yêu cầu. Ngoài ra nếu máy khách biến mất, bean không trạng thái sẽ không bị phá hủy và có thể phục vụ yêu cầu tiếp theo từ máy khách khác.

Mặt khác, một bean phiên trạng thái được kết nối chặt chẽ với máy khách. Mỗi phiên bản được tạo và liên kết với một máy khách và chỉ phục vụ các yêu cầu từ máy khách cụ thể đó. Vì vậy, xảy ra rằng nếu bạn thực hiện hai yêu cầu tiếp theo trên một bean trạng thái, yêu cầu của bạn sẽ luôn được phục vụ từ cùng một phiên bản của bean. Điều đó có nghĩa là bạn có thể duy trì trạng thái trò chuyện giữa các yêu cầu. Khi kết thúc kiểu sống, máy khách gọi một phương thức loại bỏ và bean đang bị phá hủy / sẵn sàng để thu gom rác.

Khi nào sử dụng trạng thái không trạng thái hoặc trạng thái?

Điều đó chủ yếu phụ thuộc vào việc bạn có muốn duy trì trạng thái trò chuyện hay không . Ví dụ: nếu bạn có một phương thức cộng hai số và trả về kết quả, bạn sử dụng một bean không trạng thái vì nó là hoạt động một lần. Nếu bạn gọi phương pháp này lần thứ hai với các số khác, bạn không quan tâm đến kết quả của phép cộng trước đó nữa.

Nhưng nếu bạn muốn, ví dụ, đếm số lượng yêu cầu mà khách hàng đã thực hiện, bạn phải sử dụng một bean trạng thái. Trong trường hợp này, điều quan trọng là phải biết mức độ thường xuyên mà khách hàng đã yêu cầu phương thức bean trước đó, vì vậy bạn phải duy trì trạng thái hội thoại trong bean (ví dụ với một biến). Nếu bạn sử dụng một bean không trạng thái ở đây, yêu cầu của khách hàng sẽ được phục vụ mỗi lần từ một bean khác nhau, điều này sẽ làm xáo trộn kết quả của bạn.


15
" Nếu khách hàng biến mất, bean cũng bị phá hủy ". Trên thực tế, các bean phiên trạng thái không bị phá hủy tự động trừ khi một phương thức được trang trí bởi @Remove( javax.ejb) được gọi một cách rõ ràng (phương thức đó thậm chí không cần được mã hóa. Nó có thể đơn giản được để trống / trống nếu nó được chú thích bởi @Remove). Nếu máy khách được liên kết quên hủy một bean phiên trạng thái, bean đó sẽ được lưu lại trên máy chủ cho đến khi chính vùng chứa quyết định xóa nó bằng chính sách riêng của nó. Tôi có đi sai không?
Tiny

3
Tất nhiên bạn có quyền. Thông tin thêm về vòng đời bean có thể tìm thấy ở đây: docs.oracle.com/javaee/6/tutorial/doc/giplj.html
tobiasdenzler

48

Tôi nghĩ rằng ví dụ tuyệt vời nhất về việc sử dụng một phiên Stateful là cho Giỏ hàng , nơi bạn lưu trữ tất cả các sản phẩm mà người dùng muốn mua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.