Java 线程池中的Guice DAO提供程序-查询变成';变速器怠速';
我使用Java8、Hibernate5.1.0.Final和Guice4.1.0Java 线程池中的Guice DAO提供程序-查询变成';变速器怠速';,java,multithreading,hibernate,transactions,guice,Java,Multithreading,Hibernate,Transactions,Guice,我使用Java8、Hibernate5.1.0.Final和Guice4.1.0 @Inject private Provider<ExampleDAO> exampleDAOProvider; public void test(){ ExecutorService threadPool = Executors.newFixedThreadPool(10); for (int i = 0; i < 100; i++) threadPool.
@Inject
private Provider<ExampleDAO> exampleDAOProvider;
public void test(){
ExecutorService threadPool = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++)
threadPool.execute(new Runnable() {
@Override
public void run() {
logger.info(exampleDAOProvider.find(1l));
}
});
threadPool.shutdown();
}
我试图@将Provider exampleDAOProvider
注入到任务类代码中,但它没有改变任何东西。如果我@injectexampledao
,那么我将面临并发问题(ConcurrentModificationException
),因为它使用相同的EntityManager
如果我使用@Inject-Provider-exampleDAOProvider
或direct@Inject-ExampleDAO-ExampleDAO
而不使用多线程,它工作良好,连接也会释放
为什么会这样?如何在多线程代码中释放连接?我用
@Transactional
注释了几乎所有DAO方法,这似乎解决了我的问题。处理后,事务被提交,连接被释放。未将查询实体的方法标记为@Transactional
方法,这些实体应稍后保存在同一EntityManager
或会话中,以避免使用merge()
。请注意,@Transactional
仅适用于公共方法,synchronized
不适用于@Transactional
GenericDAOImpl使用@injectprovider
而不是@injectEntityManager
:
@Inject
protected Provider<EntityManager> entityManagerProvider;
private EntityManager getEntityManager() {
return entityManagerProvider.get();
}
@Inject
受保护的提供者EntityManager提供者;
私有EntityManager getEntityManager(){
返回entityManagerProvider.get();
}
相关讨论:
UDPATE 1
要检查的其他事项:
- 如果您使用的是Hibernate 5.1.0.Final,那么persistence.xml应该包含:
而不是:
UDPATE 2
如果你正在使用
延迟加载时可能会导致连接泄漏。相关讨论:
我发布这篇文章是因为它解决了我的问题。但是,欢迎对实施提出任何意见。
@Inject
protected Provider<EntityManager> entityManagerProvider;
private EntityManager getEntityManager() {
return entityManagerProvider.get();
}