我尝试在 JRuby 环境中运行黄瓜测试。我将 cucumber rake 任务配置为在另一个线程中但在同一个 JVM 中启动嵌入式 Vert.x 应用程序服务器。在应用程序启动期间,会初始化 Neo4j 的嵌入式实例。所以最后,Cucumber、Vert.x 和 Neo4j 都在同一个 JVM 中运行(tada!)。
在一些测试场景结束时,我想检查某些数据是否已放入数据库库中。而且由于 Neo4j 文档说...
EmbeddedGraphDatabase 实例可以在多个线程之间共享。但是请注意,您不能创建指向同一个数据库的多个实例。
...我尝试获取已经初始化的 Neo4j 实例并将其用于这些检查。为了实现这一点,我编写了以下工厂。
public class ConcurrentGraphDatabaseFactory {
private static HashMap<String, GraphDatabaseService> databases = new HashMap<String, GraphDatabaseService>();
public static synchronized GraphDatabaseService getOrCreateDatabase(String path, String autoIndexFields) {
System.out.println("databases: " + databases.toString());
if (databases.containsKey(path)) {
return databases.get(path);
} else {
final GraphDatabaseService database = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder(path).
setConfig(GraphDatabaseSettings.node_keys_indexable, autoIndexFields).
setConfig(GraphDatabaseSettings.node_auto_indexing, GraphDatabaseSetting.TRUE).
newGraphDatabase();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
database.shutdown();
}
});
databases.put(path, database);
return database;
}
}
}
该工厂应确保仅对实例 perpath
进行初始化。但是如果getOrCreateDatabase
第二次访问该函数,内部数据库HashMap
仍然是空的。这会导致代码在相同数据上初始化第二个 Neo4j 实例,但失败并显示
NativeException: java.lang.IllegalStateException: Unable to lock store
它都在同一个 JVM 中运行,但似乎不同的线程具有分离的内存。
我在这里做错了什么?