从Grails 2.5.6升级后,我在Grails 3.3.8应用程序中遇到问题。
我有一个使用Row.findAll()
从H2数据库获取记录的服务。然后,它创建一个闭包列表以供将来执行。然后,列表由ThreadExecutor
通过invokeAll()
运行。在每个闭包中,我都通过Row.findById()
获取数据。
当我运行程序时它可以工作,但是在集成测试中不起作用。我检查了Row.findAll().size()
在闭包内是否返回0,但就在invokeAll()
之前它返回了正数。
更新:
我为此准备了一些小测试:
@Integration
@Rollback
class TestSpec extends Specification {
void "test something"() {
when:
f()
then:
g()
}
private void f() {
Raw raw = new Raw()
raw.text = "text"
raw.save(flush: true)
}
private void g() {
Closure closure = {
try {
def x = rawService.getRawSize()
if (x != 1) throw new Exception("A: x = " + x)
} catch (Exception e) {
e.printStackTrace()
throw e
}
}
def x = rawService.getRawSize()
executorService.invokeAll([closure])
}
}
上面的代码不起作用。它引发异常。
最佳答案
将f()
方法的主体包装在 Raw.withNewSession
块中。这会将您的新实例保存在单独的 session 中。关闭完成后, session 将关闭,并保留您的实例并允许在另一个 session 或线程中对其进行访问。
private void f() {
Raw.withNewSession {
Raw raw = new Raw()
raw.text = "text"
raw.save(flush: true)
}
}
关于grails - 集成测试期间访问另一个线程中的数据库行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167931/