Операции OpenJPA - менеджеры с одним или несколькими субъектами? - PullRequest
3 голосов
/ 14 декабря 2011

У меня есть DBManager синглтон, который обеспечивает создание экземпляра одного EntityManagerFactory.Я спорю об использовании одного или нескольких EntityManager, потому что только одна транзакция связана с EntityManager.

Мне нужно использовать несколько транзакций.JPA не поддерживает вложенные транзакции.

Итак, мой вопрос: в большинстве ваших обычных приложений, которые используют транзакции в одной среде БД, вы вообще используете одну EntityManager?До сих пор я использовал несколько EntityManager с, но хотел бы посмотреть, может ли создание одного сделать свое дело, а также немного ускорить.

Так что я нашел следующее полезное: Надеюсь, это поможет кому-то ещетоже.http://en.wikibooks.org/wiki/Java_Persistence/Transactions#Nested_Transactions

Технически в JPA EntityManager находится в транзакции с момента его создания.Так что начинать несколько излишне.Пока не будет вызвано начало, некоторые операции, такие как persist, merge, remove, не могут быть вызваны.Запросы все еще можно выполнять, и объекты, которые были запрошены, могут быть изменены, хотя в какой-то степени не определено, что произойдет с этими изменениями в спецификации JPA, обычно они будут зафиксированы, однако лучше всего позвонить начать, прежде чем вносить какие-либо изменения в свой объект.объекты.Обычно лучше создать новый EntityManager для каждой транзакции, чтобы избежать устаревших объектов в контексте постоянства, и позволить ранее управляемым объектам собирать мусор.

После успешной фиксации EntityManager можно продолжать использоватьи все управляемые объекты остаются управляемыми.Однако обычно лучше закрыть или очистить EntityManager, чтобы разрешить сборку мусора и избежать устаревших данных.Если фиксация завершается неудачно, управляемые объекты считаются отсоединенными, а EntityManager очищается.Это означает, что ошибки фиксации не могут быть перехвачены и повторены, в случае возникновения ошибки вся транзакция должна быть выполнена снова.Ранее управляемый объект также может быть оставлен в несогласованном состоянии, что означает, что некоторые версии блокировки объектов могли быть увеличены.Принять также не удастся, если транзакция была помечена для отката.Это может происходить либо явным образом путем вызова setRollbackOnly, либо его необходимо установить в случае сбоя любого запроса или операции поиска.Это может быть проблемой, так как некоторые запросы могут завершаться с ошибкой, но может быть нежелательно вызывать откат всей транзакции.

Операция отката приведет к откату только транзакции базы данных.Управляемые объекты в контексте постоянства будут отсоединены, а EntityManager будет очищен.Это означает, что любой объект, ранее прочитанный, больше не должен использоваться и больше не является частью постоянного контекста.Изменения, внесенные в объекты, будут оставлены как есть, изменения объекта не будут отменены.

1 Ответ

3 голосов
/ 14 декабря 2011

EntityManager с по определению не являются потокобезопасными. Поэтому, если ваше приложение не является однопоточным, использование единой EM, вероятно, не лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...