2011-01-20 33 views
5

Tôi có câu hỏi liên quan đến vấn đề hiệu suất có thể khi sử dụng chú thích @EJB. Hãy tưởng tượng kịch bản sau đây@EJB tiêm vs tra cứu - vấn đề hiệu suất

public class MyBean1 implements MyBean1Remote{ 
@EJB 
private MyBean2Remote myBean2; 
@EJB 
private MyBean2Remote myBean3; 
... 
@EJB 
private MyBean20Remote myBean20; 
} 

Có một hạt có nhiều phụ thuộc vào các hạt khác. Theo đặc tả EJB nếu tôi muốn tiêm MyBean1Remote cho một số bean khác, thùng chứa sẽ phải lấy tất cả các phụ thuộc bắt buộc từ nhóm của nó tiêm nó vào MyBean1Remote và sau đó tiêm tham chiếu đến MyBean1Remote stub.

như vậy trong sau nhu cầu kịch bản chứa để dự trữ 20 EJB (myBean1 và 19 phụ thuộc của nó)

public class MyAnotherBean implement MyAnotherRemote{ 
    @EJB 
    private MyBean1Remote myBean1 
} 

Hãy nói rằng trong nhiều trường hợp, chúng tôi sẽ chỉ sử dụng phụ thuộc duy nhất cho mỗi phương thức kinh doanh của myBean1. Kết quả là mỗi lần chúng ta muốn tiêm đậu đó, chúng ta buộc container chứa nhiều EJB không cần thiết. Cho phép giả định rằng chúng ta đang hoạt động trên các bean từ xa, vì vậy có lẽ container cũng sẽ cần thực hiện một số thuật toán cân bằng tải trước khi tiêm các bean phụ thuộc.

Câu hỏi:

  1. Sẽ không có dự phòng tài nguyên không cần thiết nguyên nhân và nhiều hơn nữa về vấn đề hiệu suất trong khi hoạt động trong môi trường cluster?

  2. Có thể ServiceLocator cũ tốt hơn có thể là giải pháp tốt hơn vì với cách tiếp cận này, chúng tôi sẽ yêu cầu EJB cụ thể khi chúng tôi thực sự cần nó?

Trả lời

5

Trong hầu hết các trường hợp và đặc biệt là khi sử dụng đậu phiên không trạng thái, các phiên bản bean của bạn sẽ được gộp lại. Một trong những lý do đằng sau việc tổng hợp là việc tra cứu phụ thuộc có thể tương đối tốn kém, vì vậy đậu được gộp chung với (tất cả các phụ thuộc của nó) đã được tiêm.

Vì vậy, mỗi khi bạn gọi một phương thức trên MyAnotherBean, Hạt này có 20 phụ thuộc chuyển tiếp không được tạo với tất cả các phụ thuộc đó được giải quyết khi đang di chuyển. Thay vào đó, một cá thể đã được khởi tạo đầy đủ được chọn từ nhóm và cuộc gọi phương thức được hướng đến đó.

Cũng lưu ý rằng trừ khi bạn đang thực hiện liên kết JNDI, bạn thường không thể dễ dàng tiêm các EJB từ xa.

12

Vùng chứa không tiêm một thể hiện của EJB; nó tiêm một thể hiện của một đối tượng proxy được tạo container nhẹ, thực hiện giao diện mong muốn.

public class MyBean1 implements MyBean1Remote { 
    ... 
} 

public class MyAnotherBean implement MyAnotherRemote { 
    @EJB 
    private MyBean1Remote myBean1; 
} 

Trong ví dụ của bạn, MyAnotherBean.myBean1 sẽ được tiêm một đối tượng proxy triển khai giao diện MyBean1Remote.

Giả sử không trạng thái bean phiên (vì bạn đề cập gộp), vùng chứa không phân bổ một thực thể EJB từ nhóm sẵn sàng phương pháp cho đến khi phương thức được gọi trên proxy và trường hợp được trả về hồ bơi trước khi gọi phương thức proxy trả về.

+0

+1 Vâng, đây cũng là câu trả lời hay :) Bản thân cá thể không bao giờ được tiêm, nhưng proxy là. Bên cạnh đó, như trong câu trả lời của tôi, các trường hợp thực tế trong hồ bơi đã có tất cả các phụ thuộc của họ được giải quyết. –

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