在同一个 VM 中切换 WAL 使用?

Toggling WAL usage within same VM?

我是 Hawk model indexing 工具的开发者之一。我们的工具将 XMI 模型索引到图表中以加快以后的查询速度,它需要在 "batch insert" 和 "transactional update" 模式之间来回切换。 "batch insert" 在我们第一次注意到目录中的新文件时使用,从那时起我们使用 "transactional update" 模式来保持其图形同步。

我们最近添加的 OrientDB 2.1.4 backend 使用 OrientGraphFactory 中的 getTx()/getNoTx() 方法来获取适当的 OrientGraph/OrientGraphNoTx 实例。然而,与 Neo4j 相比,我们并没有获得很好的吞吐量。使用 OrientDB 将 WAL 放入 Linux ramdisk 时,索引 set0.xmi 需要 90 秒,而在相同条件下使用我们的 Neo4j 后端需要 22 秒(机器 + OS + JDK) .我们正在使用这些附加设置来尝试减少时间:

我们考虑过在进入 "batch insert" 模式时禁用 WAL,但似乎没有一种简单的方法来打开和关闭它。看来它只能在程序启动时设置一次,仅此而已。我们已尝试显式关闭底层存储,以便在重新打开存储时再次读取 USE_WAL 标志,但这只会导致 NullPointerExceptions 和其他随机错误。

任何关于我们如何切换 WAL 或提高性能的指示都将不胜感激。

更新:我们已经切换到使用原始文档 API 并自己标记为脏 nodes/edges,我们现在达到了 55 秒,但 WAL 问题仍然存在。也试过2.2.0-beta,但实际耗时更长

我们自己解决了这个问题。留下这个以防它可能对某人有帮助:-)。在我们的后端进行了许多内部改进(仍然使用原始文档 API)并切换到 OrientDB 2.0.15 后,我们已经达到了 30 秒,我们找到了自己切换预写日志的方法。这对我们有用(db 是我们的 ODatabaseDocumentTx 实例):

private void reopenWithWALSetTo(final boolean useWAL) {
    db.getStorage().close(true, false);
    db.close();
    OGlobalConfiguration.USE_WAL.setValue(useWAL);
    db = new ODatabaseDocumentTx(dbURL);
    db.open("admin", "admin");
}

我当时很傻,以为我必须先关闭数据库,然后再关闭存储,但事实证明并非如此:-)。有必要使用 ODatabaseDocumentTx#close 方法的双参数版本,因为无参数版本基本上对通过 plocal:// URL 使用的 OAbstractPaginatedStorage 实现没有任何作用。