2010-08-03 43 views
14

tôi đang học JPA và mô hình chung trong các ví dụ có vẻ là như sau:Giữ JPA EntityManager mở?

EntityManager em = factory.createEntityManager(); 
em.getTransaction().begin(); 
// .... 
em.getTransaction().commit(); 
em.close(); 

Bây giờ tôi tự hỏi tại sao chúng ta không ngừng tạo và EntityManagers gần, như trái ngược với giữ nó mở và chỉ mới bắt đầu giao dịch mới? Những lợi ích và chi phí của việc giữ nó mở và luôn luôn đóng cửa là gì?

lý do

Trả lời

7

Hai JPA cụ thể tôi suy nghĩ:

  1. EntityManager không đảm bảo được threadsafe bởi spec JPA. Do đó, các ứng dụng JPA di động chỉ có thể sử dụng EM trong nhiều nhất một luồng tại một thời điểm. Thành ngữ của việc tạo ra một EM phương pháp cục bộ và đóng nó trước khi nó đi ra khỏi phạm vi khuyến khích ngăn xếp ngăn chặn các tham chiếu EM.

  2. Một EM sử dụng "Extended" Persistence Context Lifetime duy trì một bối cảnh kiên trì duy nhất cho toàn bộ sự tồn tại của nó. Điều này có nghĩa là các thực thể dừng tự động tách ra trên commit(). Thay vào đó, chúng phải được tách ra bằng tay, nếu không EM sẽ chịu trách nhiệm theo dõi chúng.

Câu hỏi này thực sự là phiên bản JPA dành riêng cho câu hỏi "khi tới hồ bơi". Đó là một khó khăn, nhưng câu trả lời có lẽ là "hiếm khi".

Điều này old developerWorks post bởi chuyên gia đồng thời Java Brian Goetz đã nêu rõ điểm. Ý chính: các hồ bơi có ý nghĩa tuyệt vời cho các đối tượng tốn kém, như các kết nối cơ sở dữ liệu. Nhưng đối với các đối tượng khởi tạo ngắn, nhỏ và nhanh chóng như EntityManager, gộp chung hoặc một số hình thức giữ chân tham chiếu dài hạn khác là việc bán khó khăn.

Nhưng, đó là một câu hỏi chung, do đó có ràng buộc là ngoại lệ. Có lẽ ứng dụng đơn giản hoặc đơn giản. Sau đó, những mối quan tâm về chủ đề an toàn trở thành tranh luận.

5

Việc mở trình quản lý tổ chức sẽ ngăn không cho nó trả lại kết nối với nhóm kết nối.

Điều này có thể dẫn đến một số vấn đề đặc biệt trong các ứng dụng web, ví dụ: khi hồ bơi chạy đầy đủ và tối đa kết nối kích thước đạt được, không có người dùng khác có thể có được một kết nối cơ sở dữ liệu ngăn chặn truy cập cơ sở dữ liệu cho người dùng đó.

Trong trường hợp này, tốt hơn là nên có những người quản lý thực thể sống ngắn, ví dụ: quản lý thực thể mở khi bắt đầu yêu cầu và đóng nó vào cuối yêu cầu (có thể được thực hiện với người nghe/người đánh chặn ..). Các thực thể sau đó được tách ra và bạn phải gắn lại chúng nếu bạn muốn sử dụng chúng một lần nữa (sử dụng thao tác hợp nhất của trình quản lý thực thể).

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