我正在为数据库访问编写测试,并且倾向于通过销毁数据库文件来启动它们,然后添加数据并运行测试。 (这是为了测试我的业务逻辑——我隐式信任 DataNucleus 代码。)
我的测试在第一次运行时一直通过,然后在随后的每次运行中都失败。这没有任何意义,只是我倾向于在 SBT 命令提示符下运行测试,该命令提示符在一个生命周期很长的 JVM 实例中运行所有内容。在某个时候,我添加了一个设置来派生一个新的 JVM 进行测试,并且每次都一切开始工作。
我最终发现(我认为...)DataNucleus 已经为 JVM 进行了自身初始化,并创建了一个缓存和环境 View 。当我删除数据库文件时,系统无法知道它需要重新初始化并重新创建所有内容,因为 JVM 没有停止,它没有理由知道我在背后更改了内容。
显然,为测试 fork 一个新的 JVM 可以解决问题,但我想知道是否有一个不那么极端的解决方案。基本上,有什么方法可以告诉 DataNucleus 系统重新初始化吗?最简洁的方法可能是我可以在单元测试结束时调用的 shutdown() 类方法,但我可以在开始时调用的类似 reinitialize() 或 reload() 的方法也可以。
我确实尝试在 PersistenceManagerFactory
上调用 close()
,但这似乎并没有忘记足够的东西。
最佳答案
关闭并创建一个新的 PMF 对我来说很有效,因为它创建了一个新的 StoreManager,它创建了一个到数据存储的连接池(无论它在哪里)。日志会告诉您与数据存储的连接在哪里开始和结束,以及连接池在哪里初始化
关于java - 如何在单次 JVM 运行中重新启动 DataNucleus?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18005716/