Должен ли я часто вызывать EntityManager.clear(), чтобы избежать утечек памяти?
-
19-09-2019 - |
Вопрос
Я новичок в JPA/OpenJPA и заметил, что если я не позвоню EntityManager.clear()
после того, как я сохраняю сущности, я получаю OutOfMemoryError
(Я продолжаю добавлять новые объекты в цикле).Я не уверен, является ли это ожидаемым поведением или это просто глюк OpenJPA 1.2.1.
Итак, нужно ли мне самому явно отделять сущности?Если нет, то это все равно хорошая практика?
Решение
У меня нет большого опыта работы с JPA.Однако это будет полезно -
В JPA вы должны либо:
- Создайте новый EntityManager для каждой транзакции.
- Вызовите функцию Clear() после каждой транзакции, чтобы очистить контекст персистентности.
Другие советы
Зависит от того, сколько объектов вы добавляете в процесс сохранения (читай).Если вы обрабатываете большие числа (или некоторые объекты большие), то использование методаclear() может иметь смысл.Каждый раз, когда объект читается, он должен помещаться в кеш L1 с помощью реализации JPA.
Похоже, где-то в вашем дизайне что-то не так.Обычно сущность отделяется, когда она выходит за рамки диспетчера сущностей.И это одна из причин, по которой вы не можете лениво загружать отношения вне области действия.
Насколько я знаю, я редко использовал em.clear(), если вообще когда-либо.Я использовал реализацию Hibernate и Toplink Essentials.Опыта работы с OpenJPA пока нет.