Java 从线程内部调用Spring数据存储库find方法时挂起
我想从存储库中调用find方法,但不知何故它阻塞了线程,并且永远不会返回 我们使用spring数据创建存储库 我有一个包含以下代码的测试用例: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();
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,它就工作了