2010-02-11 6 views
8

Я новичок в JPA/OpenJPA, и я заметил, что если я не позвоню EntityManager.clear() после того, как я сохраняю объекты, я получаю OutOfMemoryError (я продолжаю добавлять новые сущности в цикл). Я не уверен, что это ожидаемое поведение, или это просто и проблема с OpenJPA 1.2.1.Должен ли я часто называть EntityManager.clear(), чтобы избежать утечек памяти?

Итак, мне нужно явно отделить объекты от себя? Если это не так, это хорошая практика?

ответ

6

У меня нет большого опыта работы с JPA. Однако это будет полезно -
В JPA вы должны:
- Создайте новый EntityManager для каждой транзакции.
- Вызовите clear() после каждой транзакции, чтобы очистить контекст персистентности.

+0

Спасибо. хорошо, с подсказками в ответах, которые я понял, что я не должен использовать только один долгоживущий EntityManager в приложении. Я должен использовать область действия метода или область запроса [1]. Это устранит необходимость вызова em.clear(). Благодаря! [1] http://javanotepad.blogspot.com/2007/08/managing-jpa-entitymanager-lifecycle.html – ecerulm

+0

Полезная ссылка. Я использовал JPA с Injection Dependency Injection (используя Seam), поэтому не сталкивался с подобной проблемой. – Padmarag

5

Зависит от количества объектов, которые вы вводите в процесс сохранения (read). Если вы обрабатываете большие числа (или некоторые из них большие), то использование clear() может иметь смысл. Каждый раз, когда объект читается, он должен быть помещен в кеш L1 с помощью JPA impl.

3

Похоже, что что-то не так, в вашем дизайне. Обычно объект отделяется, когда он выходит за пределы диспетчера объектов. И это одна из причин того, что вы не можете ленить отношения нагрузки, вне сферы действия.

Насколько мне известно, я редко использовал em.clear(), если вообще когда-либо. Я использовал реализацию Hibernate и Toplink Essentials. Пока нет опыта работы с OpenJPA.

+0

, когда вы говорите, что сущность получает отдельный элемент, находящийся вне сферы управления сущностью, вы имеете в виду, что я должен закрыть EntityManager и создать новую для каждой транзакции, как предлагает Padmarag? – ecerulm