java - 如何在单次 JVM 运行中重新启动 DataNucleus?

标签 java unit-testing datanucleus

我正在为数据库访问编写测试,并且倾向于通过销毁数据库文件来启动它们,然后添加数据并运行测试。 (这是为了测试我的业务逻辑——我隐式信任 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/

相关文章:

javascript - 函数不能被 Mocha/Sinon 模拟/ stub

scala - 如果它们的差异小于 1 秒,如何使用 specs2 断言一个日期等于另一个日期?

java - JPA2 与 HBase 数据存储使用 Datanucleus 写入重复行

java - Liquibase:diff 总是生成索引

java - 如何将json转换为没有根元素的实体?

java - 为什么在 Jasmin HelloWorld 中使用 aload_0?

google-app-engine - google app engine java datastore是否缓存JPA查询结果?

java - 为代码 'CoordinateReferenceSystem' 创建 "EPSG:4326"对象时 GeoServer 数据库失败

unit-testing - 将 SWI-Prolog 代码构建到模块中,用于多个算法和数据集的单元测试

java - Datanucleus 警告 : Class was specified in persistence-unit but not annotated, 所以忽略