Я работаю над настольным приложением с использованием Java SE 7. В приложении используется несколько потоков, и в каждом потоке, который создается, DAO-класс вводится для получения доступа к моей базе данных. В качестве слоя persistence я использую EclipseLink и JPA. EntityManager впрыскивается в мой класс DAO с помощью инъекции конструкторы и так как он не поточно, я пошел для подхода с использованием Provder так:Введенный Guice EntityManager в многопоточном приложении
public PluginInstanceJpaController implements IPluginInstanceDao {
private EntityManager em;
@Injected
public PluginInstanceJpaController(Provider<EntityManager> emp) {
this.em = emp.get();
}
@Transactional
public void create(PluginInstance foo) throws Exception {
em.persist(foo);
}
}
Однако, тот же самый экземпляр EntityManager впрыскивается в каждый DAO. Для настройки этого я использовал JpaPersistModule, поскольку он предоставлен guice, и я уверен, что в моей настройке пока нет синглтонов.
Кто-нибудь знает, как сообщить о появлении нового экземпляра EntityManager при инъекции?
В другом подходе я пробовал настраиваемые поставщики для EntityManagerFactory и EntityManager и оставил JpaPersistModule вне моего бизнеса. Это привело к экземпляру EntityManager для DAO, однако @Transactional аннотированные методы не были перехвачены.
Буду признателен за решение этой проблемы. Спасибо!
--- --- РЕДАКТИРОВАТЬ
дао классы вводят в Runnable, который их использованием. Runnable также предоставляется через Поставщика. Конфигурация моего модуля выглядит примерно так:
public class RepositoryModule extends AbstractModule {
@Override
protected void configure() {
// DAO bindings
bind(IObjectStoreDao.class).to(ObjectStoreJpaController.class);
bind(IPluginInstanceDao.class).to(PluginInstanceJpaController.class);
}
@Provides
public PluginMonitor newMonitor(IPluginInstanceDao plugDao, IObjectStoreDao osDao) {
PluginMonitor m = new PluginMonitor();
m.setPluginInstanceDao(plugDao);
m.setObjectStoreDao(osDao);
return m;
}
}
Здесь PluginMonitor - это мой Runnable. Сам инжектор создается в моем основном потоке ... возможно, это была проблема?
Hi!Я использовал отладчик eclipse, который дал мне тот же идентификатор отладки на любой ссылке EntityManager в каждом потоке, поэтому, если я правильно проинформирован, это ссылки на один и тот же экземпляр. DAO вводятся Поставщиком, который предоставляет runnable (мой фактический Runnable Thread). После того, как я боролся с этим в течение нескольких часов, я решил удалить губы и пойти своим путем. Однако, возможно, это обсуждение может помочь кому-то. – Markus