我想从存储库中调用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方法也会阻塞线程。
你知道可能做错了什么吗?或者这是一个错误?
答案 0 :(得分:2)
我发现了问题。
我们在测试中使用hsqldb作为嵌入式数据库,这就是问题所在。
当我们尝试从线程运行select查询时,它会挂起。我认为它无法正确处理多个连接,但我没有深入研究。
我刚刚将数据库更改为h2并且工作正常。