Я думаю, что это уже хорошо освещено, но только для того, чтобы закрепить несколько пунктов.
DAO, если впрыскивается Spring, является
синглтон по умолчанию . Ты должен
явно установить область действия для прототипа
каждый раз создавать новый экземпляр.
Менеджер сущностей, введенный
@PersistenceContext является потокобезопасным .
При этом у меня возникли некоторые проблемы с одноэлементным DAO в моем многопоточном приложении. Я закончил тем, что сделал DAO экземпляром EJB, и это решило проблему. Так что, хотя в документации может быть сказано одно, вы, вероятно, захотите тщательно протестировать свое приложение.
Продолжение:
Я думаю, что часть моей проблемы в том, что я использую
@PersistenceContext(unitName = "unit",
type = PersistenceContextType.EXTENDED)
Если вы используете PersistenceContextType.EXTENDED, имейте в виду, что вы должны, если я правильно понимаю, вручную закрыть транзакцию. См. эту ветку для получения дополнительной информации.
Другое продолжение:
Использование экземпляра DAO является крайне плохой идеей. Каждый экземпляр DAO будет иметь свой собственный постоянный кеш, и изменения в одном кеше не будут распознаваться другими компонентами DAO. Извините за плохой совет.