2017-02-06 5 views
0

Мы разрабатываем приложение с использованием Spring-Hibernate, где одновременно работают 6 потоков. Каждый поток выполняет другую операцию и вставляет/обновляет несколько записей в общей таблице (все потоки работают с общими таблицами).Должен ли быть EntityManager в потоке в Spring-Hibernate?

Хотя мы знаем, что у нас может быть только один экземпляр EntityManagerFactory, мы не уверены, сколько экземпляров EntityManager должно быть у нас? Должны ли мы создать шесть менеджеров сущностей (по одному для каждого потока)? Как мы должны создать DAO? Должны ли мы просто создать один EntityManager, как показано ниже, и использовать тот же самый класс dao для всех потоков? Я знаю, что спецификация EM говорит, что она не является потокобезопасной, но я где-то читал, что впрыск EM в случае весны был потокобезопасным (я не был убежден в объяснении, хотя).

@Trasactional 
public class myAppDao { 
@PersistenceContext 
private EntityManager entityManager; 
.. 
} 

или мы должны сделать что-то другое?

+0

См. Это http://stackoverflow.com/questions/14888040/java-an-entitymanager-object-in-a-multithread-environment – Subin

+0

'Менеджеры сущностей не являются потокобезопасными. Но если инжектор вводит каждую нить с его собственным менеджером сущности, тогда все должно быть в порядке. Spring и, возможно, другие среды DI будут внедрять прокси-сервер ThreadLocal для реального менеджера объектов в ваши компоненты. Вызовы, которые каждый поток делает, будут прокси-сервером для реального потока-локального экземпляра диспетчера сущностей - вот как все может работать, хотя может показаться, что диспетчер сущностей совместно используется несколькими потоками. – Subin

ответ

2

Да, обычно EntityManager или Session привязаны к потоку (реализованы как переменная ThreadLocal). @PersistenceContext аннотация признана Spring IoC/CDI и обрабатывается особым образом, чтобы включить это.

В вашем приложении есть некоторый слой (обычно обозначается как @Transactional), который создает EntityManager и привязывает его к переменной ThreadLocal. Это происходит каждый раз, когда вызывается 1 @Transactional. И то же самое - EntityManager закрывается каждый раз, когда метод выходит.

В качестве альтернативы, это может быть реализовано с использованием OpenSessionInViewInterceptor или OpenSessionInViewFilter.

+0

Итак, могу ли я просто создать один класс Dao в который я инициализирую EM и внедряю dao во все другие классы, где каждый класс имеет свой собственный поток? – bluelurker

+0

Да, но не забывайте, что вызов должен проходить через метод @ @ Transactional. –

+0

Да, конечно. Большое спасибо. – bluelurker

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

  • Нет связанных вопросов^_^