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

标签 grails gorm integration-testing

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

相关文章:

hibernate - 按 Grails 中的子属性排序

grails - 重装在grails3.2.9中不起作用

hibernate - grails/GORM实例使用get vs read读取的域之间的差异

grails - GORM对象的打印ID

gorm - 为什么这些Gradle测试会引发异常?

scala - 在 SBT 中启动 Scala 应用程序进行集成测试

c# - 入口点在没有构建 IHost 的情况下退出

grails - 多个Grails应用访问同一数据库

grails - 在命名查询中访问对象的属性

ruby-on-rails - Rails 助手不在测试环境中工作