我正在使用Java SE 7的桌面應用程序工作。應用程序使用多線程,並且在創建的每個線程中注入DAO類以獲取對我的數據庫的訪問權限。作爲持久層我使用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提供的,我確信到目前爲止我的設置中沒有單例。
有沒有人知道如何告訴guice在注入時創建一個EntityManager的新實例?
在另一種方法中,我嘗試了EntityManagerFactory和EntityManager的自定義提供程序,並使JpaPersistModule離開我的業務。這導致每個DAO都有一個EntityManager實例,但是@Transactional註釋的方法沒有被攔截。
我很感謝這個問題的任何解決方案。 到目前爲止感謝!
---編輯---
的DAO類注入到正在使用他們一個Runnable。 Runnable也通過Provider提供。我的模塊配置看起來像這樣:
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。注射器本身是在我的主線程中創建的......可能這是問題嗎?
嗨!我正在使用eclipse調試器,它爲每個線程中的任何EntityManager引用提供了相同的調試ID,因此如果我將這個引用正確地通知給同一個實例。 DAO是由提供可運行的提供程序(我的實際線程可運行)注入的。經過幾個小時的努力之後,我決定刪除guice,並以我自己的方式。不過也許這個討論可能有助於某人。 – Markus