Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从线程内部调用Spring数据存储库find方法时挂起_Java_Spring_Hibernate_Spring Data_Spring Data Jpa - Fatal编程技术网

Java 从线程内部调用Spring数据存储库find方法时挂起

Java 从线程内部调用Spring数据存储库find方法时挂起,java,spring,hibernate,spring-data,spring-data-jpa,Java,Spring,Hibernate,Spring Data,Spring Data Jpa,我想从存储库中调用find方法,但不知何故它阻塞了线程,并且永远不会返回 我们使用spring数据创建存储库 我有一个包含以下代码的测试用例: Thread t = new Thread(() -> { repository.findById(1); // this line blocks the thread } t.start(); t.join(); EntityManager em = entityManagerFactory.createEntityManager();

我想从存储库中调用find方法,但不知何故它阻塞了线程,并且永远不会返回

我们使用spring数据创建存储库

我有一个包含以下代码的测试用例:

Thread t = new Thread(() -> {
    repository.findById(1); // this line blocks the thread
}
t.start();
t.join();
EntityManager em = entityManagerFactory.createEntityManager();
EntityManagerHolder emHolder = new EntityManagerHolder(em);
TransactionSynchronizationManager.bindResource(entityManagerFactory, emHolder);
存储库实现是标准的,当从主线程调用时,它可以正常工作

我注意到spring使用了一个包含当前打开会话的本地线程。因此,我尝试用以下代码在新线程中绑定一个新会话:

Thread t = new Thread(() -> {
    repository.findById(1); // this line blocks the thread
}
t.start();
t.join();
EntityManager em = entityManagerFactory.createEntityManager();
EntityManagerHolder emHolder = new EntityManagerHolder(em);
TransactionSynchronizationManager.bindResource(entityManagerFactory, emHolder);
但它不起作用,存储库调用仍然阻塞

因此,我尝试使用新创建的EntityManager使用TransactionTemplate从数据库中查找记录,如下所示:

TransactionTemplate template = new TransactionTemplate(transactionManager);
template.execute((TransactionCallback<Object>) status ->
                emHolder.getEntityManager().find(User.class, updated.getId()));
TransactionTemplate=新的TransactionTemplate(transactionManager);
template.execute((TransactionCallback)状态->
emHolder.getEntityManager().find(User.class,updated.getId());
但是它也不起作用,find方法也会阻塞线程

你知道a可能做错了什么吗?还是一个bug?

我发现了这个问题

我们在测试中使用hsqldb作为嵌入式数据库,这就是问题所在

当我们尝试从线程运行select查询时,它将挂起。我认为它不能正确处理多个连接,但我没有深入研究

我刚把数据库改成h2,它就工作了