2013-04-22 32 views
6

Trong trường hợp của tôi về ứng dụng quản lý giao dịch, tôi đã phải lựa chọn giữa:Sử dụng lại trình quản lý thực thể bởi em.clear() hoặc tạo một trình quản lý đối tượng mới?

  1. Sử dụng một đơn EntityManager và gọi clear() trước mỗi giao dịch mới. Chia sẻ số EntityManager bằng cách sử dụng ThreadLocal.
  2. Tạo mới EntityManager cho mỗi giao dịch.

Tôi không có nhiều kinh nghiệm về JPA. Câu hỏi của tôi là câu hỏi nào tốt hơn về hiệu suất?

Trả lời

8

Tôi khuyên bạn nên tạo EntityManager mới cho mỗi giao dịch. Đây là cách mà JPA được thiết kế. EntityManager không phải là một đối tượng đắt tiền để tạo ra. (EntityManagerFactory là rất tốn kém mặc dù, vì vậy đảm bảo bạn chỉ có một trong số đó).

+1

Khi sử dụng cách tiếp cận đầu tiên, đôi khi EntityManager không có trong 'sync' vì 'ThreadLocal' sẽ sinh ra EntityManager mới cho mỗi luồng. Tôi đã để lại chỉ với một lựa chọn: để tạo một EntityManager mới cho mỗi giao dịch. – user2198754

+1

James Sutherland khuyến cáo sử dụng lại EntityManager trong khi yêu cầu. Lý do chính là chia sẻ ngữ cảnh liên tục. Bạn có đồng ý không? http://www.coderanch.com/t/550734/ORM/databases/Practise-EntityManager – okwap

0

Liên kết được cung cấp bởi okwap rất hữu ích. Để chắc chắn rằng nó sẽ không lọt qua, và làm theo các quy tắc ban, tôi đặt một bản sao ở đây:

 
- an EntityManager contains a persistence context, that will track 
    everything read through it, so to avoid bloated memory, you should 
    acquire a new one, or clear it at some point 
- if you read the same object through two different EntityManager you 
    will get different objects back, so will loose object identity, which 
    is something to consider 

Trên cơ sở đó, tôi sẽ thêm, mà đọc qua hai EntityManager khác nhau thậm chí có thể cung cấp cho các đối tượng với nội dung khác nhau , nếu một giao dịch cơ sở dữ liệu được thực hiện bởi người khác trong thời gian chờ đợi. Nhưng nếu đọc lặp đi lặp lại thông qua cùng một thực thể, lần đọc thứ hai sẽ chỉ nhận được objet từ bộ nhớ cache của thực thể, do đó, trạng thái mới hơn sẽ không hiển thị.

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