从线程内部调用时,Spring数据存储库查找方法挂起

时间:2018-03-07 18:48:51

标签: java spring hibernate spring-data spring-data-jpa

我想从存储库中调用find方法,并以某种方式阻止该线程并且永远不会返回。

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

我有一个测试用例:

EntityManager em = entityManagerFactory.createEntityManager();
EntityManagerHolder emHolder = new EntityManagerHolder(em);
TransactionSynchronizationManager.bindResource(entityManagerFactory, emHolder);

存储库实现是标准的,它可以在从主线程调用时正常工作。

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

TransactionTemplate template = new TransactionTemplate(transactionManager);
template.execute((TransactionCallback<Object>) status ->
                emHolder.getEntityManager().find(User.class, updated.getId()));

但它没有用,存储库调用仍然阻止。

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

12:     browser.goto 'www.ANYURL.com'
13:     browser.text_field(id: 'inputs-newEmail').set @keyword.email

但它确实也有效,find方法也会阻塞线程。

你知道可能做错了什么吗?或者这是一个错误?

1 个答案:

答案 0 :(得分:2)

我发现了问题。

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

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

我刚刚将数据库更改为h2并且工作正常。