9

绝对难倒这一点。

我有两个成功通过的控制器集成测试。但是,在 Intellij 或 via 中运行时gradle check,JVM 永远不会退出。如果我注释掉整个集成测试,JVM 就会干净地退出。

在调试任何集成测试时,我可以暂停并看到有几个线程处于不同的状态:WAITING、RUNNING、SLEEPING。

中使用的数据库application.yml纯粹是内存中的:

 url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE

将此更改为基于文件并不能解决问题。改变DB_CLOSE_ON_EXIT=TRUE也无济于事。

我试过删除@Rollback甚至使用@Transactional超时,但这并不能解决它。

在新项目上创建集成测试不会出现死锁/挂起/等待。

我已经通过修订返回以找到此行为开始的变更集,但这些更改纯粹是在 GSP、控制器以及其中一个集成测试中的附加断言和测试方法中。

日志中的最后几行是:

INFO org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext - Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@73386d72: startup date [Mon May 30 18:48:25 BST 2016]; root of context hierarchy
INFO org.springframework.context.support.DefaultLifecycleProcessor - Stopping beans in phase -2147483648
INFO org.grails.plugins.datasource.TomcatJDBCPoolMBeanExporter - Unregistering JMX-exposed beans on shutdown
INFO org.grails.plugins.datasource.TomcatJDBCPoolMBeanExporter - Unregistering JMX-exposed beans
INFO org.hibernate.tool.hbm2ddl.SchemaExport - HHH000227: Running hbm2ddl schema export
INFO org.hibernate.tool.hbm2ddl.SchemaExport - HHH000230: Schema export complete

我尝试将集成测试方法缩减为一种方法,但问题仍然存在。

我正在使用的版本是:

$ ~/apps/grails-3.1.5/bin/grails --version
|Grails Version: 3.1.5
|Groovy Version: 2.4.6
|JVM Version: 1.8.0_92

Windows 10 64 位。

这是一个线程转储。

我不知道如何进一步调试。有任何想法吗?

4

1 回答 1

1

我会打开调试级别的日志记录。另外,如果可以的话,我会将 grails 升级到 3.1.9 之后的版本。(在我写这篇文章时,3.1.11 是最新的。)

在 grails v3.1.5 前后,Grails 和 Hibernate 之间存在配置不一致。grails 团队正在快速升级几个接口,他们很快就通过了。

结果是您最终没有运行您认为的配置。它还影响了缓存和事务管理。

当时,我必须创建冗余配置以确保 Grails 在一个级别上获取配置,在另一个级别上休眠。您不必再这样做了,但当时,我不得不使用此处列出的配置。

为了找到问题所在,我为 grails 和 hibernate 以及我所有的数据库驱动程序打开了调试日志记录,并一直涉足它。

该插件还有助于提供详细的监控信息:

于 2016-09-12T23:01:11.203 回答