Tôi hiện đang tạo Lớp Truy cập Dữ liệu EJB3 để xử lý tất cả các hoạt động cơ sở dữ liệu trong ứng dụng Java EE 6 của tôi. Bây giờ, kể từ khi Java EE 6 cung cấp ApplicationScoped-Annotation mới, tôi tự hỏi EJB của tiểu bang nào nên có, hoặc nếu nó phải là không trạng thái.JavaEE6 DAO: Có nên là @Stateless hoặc @ApplicationScoped không?
Có thể nào tốt hơn để cho DAO là một phiên phiên @Stateless Bean hoặc một @ApplicationScoped Bean? Còn về @Singleton? Sự khác nhau giữa các tùy chọn này liên quan đến DAO là gì?
EDIT: Tôi đang sử dụng Glassfish 3.0.1 với đầy đủ Java EE 6 nền tảng
Cảm ơn bạn đã trả lời! Tôi không muốn thảo luận ở đây nếu một DAO có ý nghĩa. Đối với tôi, nó có ý nghĩa để sử dụng một. Ít nhất cho đến khi Module Seam 3 Persistence sẵn sàng để sản xuất;) Vì vậy, bạn nói rằng tôi không nên buộc lớp DAO vào API EJB. Nhưng còn về giao dịch và bảo mật thì sao? Tôi sẽ sử dụng các dịch vụ đó ở đâu, nếu không phải cho các hoạt động cơ sở dữ liệu -> DAO? Các dịch vụ này không được cung cấp bởi CDI, ít nhất là không giống như cách quản lý container JavaEE6 thông thường. Hoặc có lẽ tôi nên trộn CDI và EJB? – ifischer
@ifischer: DAO chắc chắn KHÔNG chịu trách nhiệm về kiểm soát giao dịch và phân giới (hoặc bảo mật), sử dụng SLSB (một Mặt tiền Phiên) cho điều đó. Vì vậy, có, sử dụng EJB và CDI. –
> 'EJB được gộp bởi vùng chứa vì vậy nếu bạn có N trường hợp trên mỗi nhóm và hàng nghìn bảng' - 1. Nếu bạn có hàng ngàn bảng và hàng nghìn thực thể bạn có thể cần phải sửa đổi thiết kế của mình. Bên cạnh đó, các trường hợp EJB thường được tạo theo yêu cầu và không phải trước và chắc chắn không phải cho toàn bộ dung lượng hồ bơi cùng một lúc. Sau đó, ngay cả khi hàng ngàn người trong số họ sẽ được tạo ra, yêu cầu bộ nhớ của hàng ngàn trường hợp là chỉ một megabyte, đó là hoàn toàn không đáng kể. Có một khoản chi phí nhỏ khi khởi động máy chủ ứng dụng (mà tôi thực hiện là ý của bạn với thời gian triển khai) –