Java 线程池中的Guice DAO提供程序-查询变成';变速器怠速';

Java 线程池中的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.

我使用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.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();
}