java - 按存储顺序遍历 BerkleyDB 数据库

标签 java berkeley-db-je database-cursor

在 BerkleyDB JE 中使用游标时,我发现遍历数据集会生成大量随机读取 IO。这是因为 BDB 按主键升序遍历数据集。

在我的应用程序中,我没有任何要求按顺序处理数据集(从数学上讲,我的操作是可交换的),并且我对最大化吞吐量感兴趣。

有没有办法用光标按存储顺序而不是按主键顺序处理数据集。

最佳答案

我想不会; BDBJE 是一个日志结构的数据库——即所有写入都附加到日志的末尾。这意味着记录始终附加到最后一个日志,并且可能会取代先前日志中的记录。由于 BDBJE 在设计上无法写入旧日志,因此它无法将旧记录标记为已取代,因此您无法向前浏览存储处理记录,因为如果没有处理日志中稍后的记录,您不知道该记录是否是最新的。

当旧日志的“实时”记录数量减少时,BDBJE 将通过将实时记录复制到新日志中并删除旧文件来清理旧日志,这会进一步打乱排序。

我发现Kyoto Cabinet 的Java 绑定(bind)在原始插入性能方面比BDB 更快,并且您可以选择存储格式,这可以让您优化游标排序记录遍历性能。许可证类似(Kyoto Cabinet 是 GPL3,BDB 是 Oracle BDB 许可证(copyleft)),除非您在任何一种情况下都支付商业许可证费用。

更新:As of version 5.0.34 ,BDBJE 包含 DiskOrderedCursor 类,它解决了所需的用例 - 它按日志顺序遍历记录,在未碎片的日志文件中应与磁盘顺序相同。

关于java - 按存储顺序遍历 BerkleyDB 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5946827/

相关文章:

java - 约 10 秒后与 Airflow docker 容器断开连接

python - 为什么在尝试通过 pymongo 查询我的 mongodb 数据库时得到 pymongo.cursor.Cursor?

sql-server - SQL Server存储过程游标名称冲突

使用游标组装准备好的语句时 MySQL 最后一行的挑战

java:访问 AbstractTableModel 中的 JProgressBar

java - 双指缩放和 Viewpager 无法同时工作

java - 如何使用 JDT AST 获取注释的类型?

database - BDB JE 嵌入式数据库的替代方案

java - 哪种访问 berkeley db 的方法更好

java - 推荐一个快速且可扩展的持久化 Map - Java