2010-02-11 21 views
8

Tôi mới tham gia JPA/OpenJPA và tôi nhận thấy rằng nếu tôi không gọi EntityManager.clear() sau khi tôi duy trì các pháp nhân, tôi nhận được OutOfMemoryError (Tôi tiếp tục thêm các thực thể mới trong một vòng lặp). Tôi không chắc chắn nếu đây là hành vi dự kiến ​​hoặc nó chỉ và OpenJPA 1.2.1 trục trặc.Tôi có phải gọi EntityManager.clear() thường xuyên để tránh rò rỉ bộ nhớ không?

Vì vậy, tôi có phải tự mình tách riêng các thực thể đó không? Nếu tôi không, đó là một thực hành tốt?

Trả lời

6

Tôi không có nhiều kinh nghiệm với JPA. Tuy nhiên, điều này sẽ hữu ích -
Trong JPA, bạn phải:
- Tạo Trình quản lý thực thể mới cho mỗi giao dịch.
- Gọi xóa() sau mỗi giao dịch để xóa ngữ cảnh liên tục.

+0

Cảm ơn. ok, với các gợi ý trong các câu trả lời tôi đã tìm ra rằng tôi không được phép sử dụng chỉ một EntityManager tồn tại trong ứng dụng. Tôi nên sử dụng phạm vi phương pháp hoặc phạm vi yêu cầu [1]. Điều đó sẽ loại bỏ nhu cầu gọi em.clear(). Cảm ơn! [1] http://javanotepad.blogspot.com/2007/08/managing-jpa-entitymanager-lifecycle.html – ecerulm

+0

Liên kết hữu ích. Tôi đã sử dụng JPA với Dependency Injection (sử dụng Seam), vì vậy đã không phải đối mặt với vấn đề tương tự. – Padmarag

5

Phụ thuộc vào số lượng đối tượng bạn đưa vào quy trình kiên trì (đọc). Nếu bạn xử lý các số lớn (hoặc một số đối tượng lớn) thì việc sử dụng clear() có thể có ý nghĩa. Mỗi khi một đối tượng được đọc nó sẽ được đặt trong bộ nhớ cache L1 bởi impl JPA.

3

Có vẻ như có gì đó không ổn ở đâu đó, trong thiết kế của bạn. Thông thường, thực thể được tách ra khi nó nằm ngoài phạm vi của người quản lý thực thể. Và đó là một trong những lý do bạn không thể lười biếng tải quan hệ, bên ngoài phạm vi.

Theo kinh nghiệm của tôi, tôi hiếm khi sử dụng em.clear(), nếu có. Tôi đã sử dụng triển khai Hibernate và Toplink Essentials. Chưa có kinh nghiệm với OpenJPA.

+0

khi bạn nói rằng các thực thể được tách ra một nó nằm ngoài phạm vi của quản lý thực thể bạn có nghĩa là tôi nên đóng EntityManager và tạo một cái mới cho mỗi giao dịch như Padmarag cho thấy? – ecerulm

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