2012-04-30 4 views
10

EntityManager is небезопасно по определению. Характеристики сервлетов говорят, что в нераспределенной среде и без реализации SingleThreadModel существует только один экземпляр сервлета за определение.@PersistenceContext EntityManager потоковая безопасность в Spring и Java EE

Поэтому в Java EE, когда вы инжектировать EntityManager через @PersistenceContext в поле сервлета - это не поточно:

public class MyServlet extends HttpServlet { 

    // Not thread-safe, should be using EMF instead. 
    @PersistenceContext 
    private EntityManager em; 
} 
  1. Является ли это правильно сказать, что, несмотря на масштабы по умолчанию Spring фасолью является одноточечным, EntityManager является потокобезопасным, так как Spring использует ThreadLocal для привязки его транзакций и EntityManager к нему?

  2. Является ли приведенный выше пример сервлетов действительным весной? Не по-прежнему ли это небезопасно?

  3. Подходит ли подход ThreadLocal только для управляемых фасолей Spring и простого сервлета, не является ли это одним из них?

  4. Насколько я помню, в контейнер входит ответственность за введение EntityManager. В реализации Java EE Glassfish именно сервер приложений обнаружил @PersistenceContext как точку впрыска.
    Как это выглядит весной? Является ли Spring Framework ответственным за обнаружение этих аннотаций или это ответственность разработчика JPA?

ответ

5

Вопрос 2, 3 и 4 - Весна не обращает внимания ни на один класс, который не является весенним бобом. Поэтому весна не обращает на вас внимания MyServlet класс. Поэтому ответ на

  • 2) не
  • 3) только Весна управляемых компонентов
  • 4) несет ответственность пружины, потому что весна Контейнер

К вопросу 1). Он работает таким образом, поэтому использование Spring Injected Entity Manager - эффективное сохранение потока.

+0

Спасибо Ralph. Поэтому, говоря «2», нет «вы имеете в виду, что он не является потокобезопасным, потому что этот сервлет не является весенним бобом, так что на самом деле ** никакой инъекции вообще не будет **? Можно ли пометить такой сервлет как весенний боб? Я как-то чувствую, что это довольно редко, не рекомендуется и беспорядочная идея - это просто теоретический вопрос, чтобы понять механизм Весны. –

+1

Я имею в виду, что это не фасоль весны (вот что такое первый абзац), поэтому нет инъекции, а 'em' будет пустым. - Проверьте это, если это не пустое, тогда что-то действительно странное продолжается. Один из способов, по которым вы можете попытаться сделать это весенним бобом, - '@ Configurable', но для этого требуется реальный AspectJ, и я действительно не знаю, работает ли это для Servlets. – Ralph

Смежные вопросы