Java 如何在单个JVM运行中重新启动DataNucleus?

Java 如何在单个JVM运行中重新启动DataNucleus?,java,unit-testing,datanucleus,Java,Unit Testing,Datanucleus,我正在为我的数据库访问编写测试,并倾向于通过销毁数据库文件、添加数据并运行测试来启动它们。(这是为了测试我的业务逻辑——我隐式信任DataNucleus代码。) 我的测试在第一次运行时一直通过,随后的每次运行都失败。这毫无意义,只是我倾向于在SBT命令提示符下运行测试,它在一个非常长寿命的JVM实例中运行所有测试。在某个时候,我添加了一个设置来为测试派生一个新的JVM,并且每次都开始工作 我最终发现(我想…)DataNucleus已经为JVM初始化了自己,并创建了一个缓存和一个环境视图。当我删除

我正在为我的数据库访问编写测试,并倾向于通过销毁数据库文件、添加数据并运行测试来启动它们。(这是为了测试我的业务逻辑——我隐式信任DataNucleus代码。)

我的测试在第一次运行时一直通过,随后的每次运行都失败。这毫无意义,只是我倾向于在SBT命令提示符下运行测试,它在一个非常长寿命的JVM实例中运行所有测试。在某个时候,我添加了一个设置来为测试派生一个新的JVM,并且每次都开始工作

我最终发现(我想…)DataNucleus已经为JVM初始化了自己,并创建了一个缓存和一个环境视图。当我删除数据库文件时,系统无法知道它需要重新初始化和重新创建所有内容,因为JVM没有停止,它也没有理由知道我在背后更改了内容

显然,为测试提供一个新的JVM解决了这个问题,但我想知道是否有一个不那么极端的解决方案。基本上,是否有某种方法可以告诉DataNucleus系统重新初始化?最干净的方法可能是
shutdown()
一种我可以在单元测试结束时调用的方法,但是像
reinitialize()
reload()
这样我可以在开始时调用的方法也可以


我确实尝试在
PersistenceManagerFactory
上调用
close()
,但这似乎并没有忘记足够的内容。

关闭并创建一个新的PMF对我来说很有效,因为它创建了一个新的StoreManager,可以创建到数据存储(无论在哪里)的连接池。日志将告诉您到数据存储的连接在哪里开始和结束,连接池在哪里初始化

关闭并创建新的PMF对我来说很有效,因为它创建了一个新的StoreManager,它将创建到数据存储的连接池(无论在哪里)。日志将告诉您数据存储连接的开始和结束位置,以及连接池的初始化位置

我将测试夹具更改为使用
SchemaAwareStoremager。删除
创建
,现在一切似乎都正常了。不幸的是,我同时更改了一些其他内容,因此不清楚我是否正确关闭了
PersistenceManagerFactory
,或者我正在做其他事情。无论如何,关闭PersistenceManagerFactory
确实有效。谢谢我将测试夹具更改为使用
schemaawarestoremanger。删除
创建
,现在一切似乎都正常了。不幸的是,我同时更改了一些其他内容,因此不清楚我是否正确关闭了
PersistenceManagerFactory
,或者我正在做其他事情。无论如何,关闭PersistenceManagerFactory
确实有效。谢谢