EntityManager
является небезопасным для резьбы -по определению. Спецификации сервлетов говорят, что в нераспределенной -среде и без реализации SingleThreadModel
существует только один экземпляр сервлета для каждого определения .
Следовательно, в Java EE, когда вы вставляете EntityManager
через @PersistenceContext
в поле сервлета -, это не является потокобезопасным:
public class MyServlet extends HttpServlet {
// Not thread-safe, should be using EMF instead.
@PersistenceContext
private EntityManager em;
}
Правильно ли говорить, что хотя областью действия компонентов Spring по умолчанию является одноэлементный, EntityManager
является потокобезопасным -, поскольку Spring использует ThreadLocal
для привязки своей транзакции и EntityManager
к ней?
Приведенный выше пример сервлетов по-прежнему актуален для Spring? Это все еще не потокобезопасно -?
Подход ThreadLocal
работает только для управляемых компонентов Spring, а простой сервлет не является одним из них?
Насколько я помню, за вставку EntityManager
отвечает контейнер. В реализации Glassfish Java EE именно сервер приложений обнаруживает @PersistenceContext
как точку внедрения.
Как это выглядит весной? Отвечает ли Spring Framework за обнаружение этих аннотаций или за это отвечает разработчик JPA?