Neo4j商店没有干净地关闭;从中断的批量插入中恢复不一致的db状态

时间:2013-12-15 07:46:44

标签: database neo4j

我是在博客文章http://michaelbloggs.blogspot.de/2013/05/importing-ttl-turtle-ontologies-in-neo4j.html之后将ttl本体导入dbpedia。该帖子使用BatchInserters来加速任务。它提到

批量插入不是交易性的。如果出现问题并且您没有正确关闭()数据库,则数据库会变得不一致。

我不得不中断其中一个批处理插入任务,因为它花费的时间比预期的要长得多,这使我的数据库处于不一致状态。我收到以下消息:

  

db_name store未完全关闭

如何从此状态恢复数据库?此外,为了将来的目的,有一种方法可以在导入每个文件后进行提交,以便恢复到最后一个状态将是微不足道的。我想到了git,但我不确定它是否对像index.db这样的二进制文件有帮助。

1 个答案:

答案 0 :(得分:2)

在某些情况下,在使用批量插入器api时无法从不干净的关闭中恢复,请注意其包名org.neo4j.unsafe.batchinsert包含单词unsafe,原因如此。批量插入器的目的是尽可能快地运行。

如果你想保证一个干净的关机,你应该试一试:

BatchInserter batch = BatchInserters.inserter(<dir>);
try {

} finally {
   batch.shutdown();
}   

特殊情况的另一种选择是注册JVM关闭钩子。请参阅以下代码段作为示例:

BatchInserter batch = BatchInserters.inserter(<dir>);

// do some operations potentially throwing exceptions

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        batch.shutdown();
    }
});