Spring: @PersistenceContext и @Autowired безопасность потоков? - PullRequest
6 голосов
/ 25 февраля 2011

на основе этого примера:

@Service
public class Purchase {
  @PersistenceContext
  private EntityManager em;

  @Autowired
  private PurchaseDAO dao;

  private String normalField;

  .... // methods, operations, etc
}

Пожалуйста, помогите исправить меня, если я ошибаюсь:

  1. Класс обслуживания Покупка и Покупка DAO - это синглтоны, управляемые весной
  2. Поле класса обслуживания normalField не является потокобезопасным, поскольку singleton - это один объект, совместно используемый многими
  3. Предположим, что @ Repository-annotated-PurchaseDAO не имеет никакого поля, что означает, что оно потокобезопасно, будет автоматически добавлено к весне
  4. Экземпляр EntityManager также является потокобезопасным свойством, поскольку @ PersistenceContext обеспечит использование entityManager текущей транзакции.

Спасибо!

1 Ответ

8 голосов
/ 25 февраля 2011
  1. По умолчанию они являются синглетами (если они управляются Spring), если вы не настроили их иначе (из xml-конфигурации или с помощью аннотаций вы можете установить его с помощью @Scope).
  2. И да и нет.Да, это небезопасно в том смысле, что несколько потоков могут обращаться к нему и изменять его одновременно, и нет, потому что это зависит от типа данных, а String является неизменным (и, по крайней мере, считается поточно-ориентированным).Возможно, он взорвется, если два разных потока попытаются сохранить новую строку в переменной-члене в один и тот же момент.
  3. Да и снова нет.Если у DAO нет внутреннего состояния, да, я бы сказал, что это потокобезопасно, но объекты, с которыми он работает, могут не быть (хотя, если вы используете JPA-сущности, они должны быть).
  4. Впо крайней мере, в документации Hibernate говорится, что EntityManager не безопасен для потоков, но при использовании EntityManager, внедряемого Spring, это не должно вызывать проблем.

Форумы SpringSource: У меня естьискал ответы на тот же вопрос на форуме ... Похоже, что общее мнение заключается в том, что, хотя EntityManager не является потокобезопасным в соответствии со спецификациями JPA, EntityManager, внедренный Spring через прокси-сервер EntityManager, может быть.1016 * Hibernate: EntityManager - это недорогой, не поддерживающий потоки объект, который следует использовать один раз для одного бизнес-процесса, одной единицы работы и затем отбрасывать.EntityManager не получит JDBC-соединение (или источник данных), если в этом нет необходимости, поэтому вы можете безопасно открывать и закрывать EntityManager, даже если вы не уверены, что доступ к данным потребуется для обслуживания определенного запроса.

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