2011-01-30 34 views
12

Nếu tôi có @ManagedBean@SessionScoped, tại sao tôi nên sử dụng @Stateful EJB? Tôi đã sử dụng nó trước khi mua xe và duy trì trạng thái đàm thoại, nhưng vì một bean được quản lý sẽ được giữ trong phiên người dùng, tôi có thể lưu trữ trạng thái ở đó, sau đó gọi SLSB cho logic kinh doanh. Đúng không? Nếu có, thì ejbs trạng thái sẽ được để lại cho các ứng dụng cụ thể hơn, chẳng hạn như khi bạn cần giao dịch, v.v ...?đậu được quản lý theo phiên so với stateful ejb

Trả lời

13

Rất thường xuyên phiên đậu đậu có thể được sử dụng cho rất nhiều vấn đề kinh doanh.

Trạng thái không nhất thiết có nghĩa là chỉ có máy chủ từ xa giữ trạng thái, mặc dù đây chắc chắn là một trong các tùy chọn. Một khách hàng Swing từ xa trước tiên có thể gửi một loạt dữ liệu đến một bean phiên trạng thái, giữ lại phần còn lại và sau đó gửi một số lệnh hoạt động trên dữ liệu này. Điều này giúp khách hàng không phải gửi cùng một lượng dữ liệu (lớn) mỗi lần.

Trong trường hợp sử dụng từ xa, nó thực sự phần nào phản ánh việc sử dụng phiên HTTP khi trình khách web (trình duyệt) được sử dụng. Sự khác biệt chính là phiên là mỗi bean ở đây, trong khi với phiên HTTP, phiên là một phạm vi được chia sẻ bởi nhiều bean. Vì phiên HTTP dựa trên cookie và cookie là toàn cầu cho tên miền cho toàn bộ trình duyệt, phiên HTTP không thể trực tiếp hỗ trợ nhiều phiên từ cùng một ứng dụng (ví dụ: mỗi tab hoặc mỗi cửa sổ). Điều này là tầm thường với đậu phiên trạng thái.

Tuy nhiên ...

Khách hàng Swing từ xa nói chuyện với các EJB từ xa không phải là điều bình thường. Trong bối cảnh bạn mô tả trong câu hỏi của mình, bạn thường sẽ sử dụng các EJB cục bộ và bạn sẽ lưu trữ hầu hết trạng thái trong phiên HTTP (hãy cẩn thận với việc chia sẻ!) Và những ngày này trong phạm vi xem hoặc phạm vi hội thoại.

Vì vậy, cuối cùng, khi nào sử dụng đậu phiên trạng thái trong trường hợp này?

Một trường hợp sử dụng quan trọng là extended persistence context trong JPA. Thông thường với một quản lý thực thể giao dịch phạm vi, khi một thực thể vượt qua ranh giới giao dịch của một phương thức EJB gọi nó sẽ được tách ra. Nếu bạn muốn (lạc quan) khóa một thực thể giữa các tương tác của người dùng, điều này là không mong muốn. Bạn sẽ mất khóa.

Với bối cảnh kiên trì mở rộng, thực thể vẫn được đính kèm và các khóa hợp lệ khi bạn quay trở lại từ một cuộc gọi đến bean phiên trạng thái. Điều này rất hữu ích cho chức năng xem trước để đảm bảo rằng không ai khác đã thực hiện bất kỳ thay đổi nào đối với thực thể khi bạn ổn sau khi xem trước. Hoặc thực sự cho một giỏ mua hàng, nơi bạn muốn đảm bảo rằng trong một thời gian không thể bán hàng cho bất kỳ ai khác trong khi trong giỏ hàng.

+0

Cảm ơn câu trả lời rất chi tiết. Tôi nghĩ việc sử dụng đậu trạng thái đã được giảm xuống một cái gì đó rất cụ thể – arg20

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