gpt4 book ai didi

grails - 集成测试期间访问另一个线程中的数据库行

转载 作者:行者123 更新时间:2023-12-02 15:17:22 25 4
gpt4 key购买 nike

从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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com