2010-11-19 27 views
25

Tôi có số EntityManagerFactory để tôi có thể tạo một (hoặc nhiều) EntityManager trường hợp. Tôi đang sử dụng một môi trường Servlet, và tôi đã có một EntityManagerFactory có dây tới servlet (thông qua ngữ cảnh servlet) được chia sẻ cho toàn bộ thời gian của servlet (và do đó, đối với tất cả người dùng).Tôi nên tạo EntityManager bao lâu một lần?

tôi có thể làm một trong các cách sau:

  • Tạo một EntityManager duy nhất cho cuộc đời của servlet của tôi (ví dụ như chia sẻ giữa tất cả người dùng)
  • Tạo một tài khoản cho mỗi người dùng (do đó mỗi người dùng riêng của họ trong HttpSession)
  • Tạo một tài khoản theo yêu cầu HTTP (nói, bởi instantiating một cái mới và đóng lại ở phần cuối của một phương pháp doGet)

nào là thích hợp nhất? Chi phí tạo ra một EntityManager có ý nghĩa không? Nếu tôi thực hiện một EntityManager được chia sẻ, có một phạm vi giao dịch đơn lẻ (tức là các cập nhật giữa người dùng độc lập có thể thực hiện các thay đổi khác) không?

Trả lời

24

Một EM cho toàn bộ servlet không tốt. Nếu bạn không sử dụng EM được quản lý bởi container (ví dụ EJB3) thì việc tái phân bổ là sử dụng EM cho một số particular unit of work.

Trong ngữ cảnh ứng dụng web, đề xuất thứ ba của bạn (mỗi yêu cầu HTTP) có vẻ tốt. Tuy nhiên, điều này có thể dẫn bạn xuống một cạm bẫy khi bạn đang buộc lớp dịch vụ của bạn với lớp db của bạn (lớp dịch vụ của bạn thậm chí không nên biết về sự tồn tại của EM).

Một cách tiếp cận khác sẽ là hủy bỏ các giao dịch theo lập trình trong DAO của bạn và nhận DAO của bạn để sử dụng EM mới cho mọi cuộc gọi phương thức.

Chỉnh sửa: EMs có giá rẻ để tạo thay vì EMF có chi phí đáng kể. Sử dụng một EMF (mà nó xuất hiện mà bạn làm) và rất nhiều EMs là con đường để đi.

+0

Đồng ý. Tôi hoàn toàn đề nghị bạn sử dụng một khung công tác tích hợp như EJB 3 hoặc khung công tác Spring sẽ loại bỏ gánh nặng của quản lý EntityManager. –

1

chúng tôi thực hiện một trình quản lý thực thể được tiêm cho mỗi slsb và - slsb được truy cập thông qua đại biểu, trong đó có một phiên cho mỗi phiên, tìm giao diện cục bộ/từ xa. Sử dụng ejb3.0.

+0

Làm cách nào để có một bean không trạng thái mỗi phiên? Đậu không định trạng theo định nghĩa không bị ràng buộc với phiên. –

+0

@Philipp Jardas đã chỉnh sửa. Đậu không trạng thái được định nghĩa là không lưu trữ trạng thái/dữ liệu đàm thoại có thể nối tiếp được. Vì vậy, nó hoàn toàn hợp lệ để tạo ra một thể hiện của một slsb cho mỗi phiên. Đó là sự hiểu biết của tôi họ có ít hơn nhiều so với một SFSB. – NimChimpsky

+0

"hợp lệ để tạo một phiên bản của một slsb cho mỗi phiên". Kể từ khi nào chúng tôi nhận được một phương pháp nhà máy cho phép chúng tôi tạo ra các trường hợp EJB không trạng thái? Tôi nghĩ bạn có nghĩa là EJB nhà nước: ứng dụng kiểm soát vòng đời (mỗi lần tra cứu tạo ra một bean mới và ứng dụng phải gọi phương thức @Remove hoặc để cho thời gian chờ của bean) hoặc kiểm soát ngầm vòng đời của CDI (ví dụ sử dụng @SessionScoped). –

0

Có, tôi đồng ý với NimChimpsky và Qwerky để sử dụng EJB3.x khi truy cập DB và sử dụng một EM cho mỗi đơn vị công việc.

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