Мы разрабатываем приложение с использованием Spring-Hibernate, где одновременно работают 6 потоков. Каждый поток выполняет другую операцию и вставляет/обновляет несколько записей в общей таблице (все потоки работают с общими таблицами).Должен ли быть EntityManager в потоке в Spring-Hibernate?
Хотя мы знаем, что у нас может быть только один экземпляр EntityManagerFactory
, мы не уверены, сколько экземпляров EntityManager
должно быть у нас? Должны ли мы создать шесть менеджеров сущностей (по одному для каждого потока)? Как мы должны создать DAO? Должны ли мы просто создать один EntityManager
, как показано ниже, и использовать тот же самый класс dao для всех потоков? Я знаю, что спецификация EM говорит, что она не является потокобезопасной, но я где-то читал, что впрыск EM в случае весны был потокобезопасным (я не был убежден в объяснении, хотя).
@Trasactional
public class myAppDao {
@PersistenceContext
private EntityManager entityManager;
..
}
или мы должны сделать что-то другое?
См. Это http://stackoverflow.com/questions/14888040/java-an-entitymanager-object-in-a-multithread-environment – Subin
'Менеджеры сущностей не являются потокобезопасными. Но если инжектор вводит каждую нить с его собственным менеджером сущности, тогда все должно быть в порядке. Spring и, возможно, другие среды DI будут внедрять прокси-сервер ThreadLocal для реального менеджера объектов в ваши компоненты. Вызовы, которые каждый поток делает, будут прокси-сервером для реального потока-локального экземпляра диспетчера сущностей - вот как все может работать, хотя может показаться, что диспетчер сущностей совместно используется несколькими потоками. – Subin