2013-04-10 13 views
7

Chúng tôi biết Đậu phiên không có quốc tịch không giữ trạng thái bằng bất kỳ phương tiện nào. Sau đó, điểm của việc có một biến toàn cục trong Bean Session Session là gì? Tại sao nó không bị chặn trong đặc tả (để tránh nhầm lẫn không cần thiết)?Điểm có biến toàn cục trong Bean Session Session là gì?

Nếu có bất kỳ lợi ích thiết thực nào của việc có biến toàn cục, vui lòng giải thích bằng một đoạn mã.

+0

Xác định "biến toàn cầu"; Tôi hỏi vì nó không phải là một thuật ngữ Java chuẩn, và có thể có nghĩa là những thứ khác nhau với những người khác nhau. –

Trả lời

0

Rõ ràng mọi câu trả lời đều phải nêu rõ phiên không trạng thái EJB không được giữ trạng thái giữa các cuộc gọi đến các phương thức trên EJB.

Thay vì thực hiện phương pháp tiếp cận đường lối cứng rắn bằng cách cấm các biến mẫu trong EJB, nhà phát triển EJB được phép xác định chúng để lưu trữ trung gian. Có thể có các giá trị trung gian, và các phương thức riêng tư nội bộ đang được gọi; thay vì truyền tham số và/hoặc tạo "đối tượng trạng thái tức thời" được chuyển cho ngắn hạn, nhà phát triển (được cho là lười) có thể chỉ sử dụng các biến mẫu.

Chìa khóa ở đây, được giải quyết bằng thông số, là mà trong mọi trường hợp nhà phát triển EJB giả định rằng bất kỳ trường nào sẽ duy trì thông tin có ý nghĩa qua lời gọi của EJB.

+0

Về báo giá cuối cùng: Bạn có thể vui lòng thêm phiên bản và đoạn của thông số bạn đã trích dẫn không. – Beryllium

+0

@Beryllium Tôi đã cố gắng nhấn mạnh điểm, không trích dẫn bất cứ điều gì trực tiếp. Tôi thấy bạn đã cung cấp báo giá có liên quan - điều đó thật tuyệt. "Conversational" là chính xác điểm (và từ ngữ spec!) Tôi đã cố gắng thực hiện. –

7

Một câu nói từ Đậu EJB 3.1 spec

4,7 Stateless Session

đậu phiên Stateless là đậu phiên có trường hợp có không trạng thái đàm thoại. Điều này có nghĩa là tất cả các cá thể đậu là tương đương khi chúng không liên quan đến việc phục vụ một phương thức do khách hàng gọi.

Thuật ngữ "không quốc tịch" biểu thị rằng một cá thể không có trạng thái cho một khách hàng cụ thể. Tuy nhiên, các cá thể của cá thể có thể chứa trạng thái trên các cuộc gọi phương thức gọi của máy khách.

Ví dụ về trạng thái bao gồm kết nối cơ sở dữ liệu mở và đối tượng tham chiếu đến đối tượng bean của doanh nghiệp.

Sự nhấn mạnh là trên không có trạng thái hội thoại. Họ có thể có trạng thái "khác".


Ví dụ, tôi đã sử dụng nó để kiểm tra nếu tải được lan truyền như nhau trên tất cả các trường trong một cụm nút:

@Stateless(name = "DemoPingSb") 
@Remote(DemoPingSbIfc.class) 
public class DemoPingSb implements Serializable, DemoPingSbIfc { 
    private final AtomicInteger instancePingCount = new AtomicInteger(0); 
    private final static AtomicInteger classPingCount = new AtomicInteger(0); 

    public DemoPingSb() { 
     super(); 
    } 

    public String ping(final String s) { 
     final int local = this.instancePingCount.incrementAndGet(); 
     final int global = classPingCount.incrementAndGet(); 

     System.out.println("INFO: local " + local + ", global " + global 
       + ", s " + s); 

     return s.toUpperCase(); 
    } 
} 

và nếu có đủ tải:

13: 13: 21,769 THÔNG TIN [stdout] (http-localhost-127.0.0.1-8080-1) THÔNG TIN: địa phương 22, toàn cầu 22, s hello
13: 13: 21,936 THÔNG TIN [stdout] (http-localhost-127.0. 0.1-8080-1) INFO: địa phương 1, toàn cầu 23, s hello

Vì vậy, có một số trường hợp đặc biệt mà tính năng này có thể hữu ích.

Bình luận

  • Các spec nói về biến dụ; việc sử dụng các biến tĩnh không được đề cập ở đó. Vì vậy, các mã có thể không chính xác liên quan đến classPingCount
  • Việc sử dụng một AtomicInteger cho instancePingCount thể bằng cách thay thế bằng volatile int, bởi vì (4.10.13)

Các thùng chứa phải đảm bảo rằng chỉ có một thread có thể được thực hiện một phiên phiên độc lập hoặc không trạng thái phiên bản bất kỳ lúc nào.

  • Một stateless session bean không bao giờ thụ động (4,2)
+0

+1, tóm tắt tuyệt vời. –