如何在不记录/写入 __db.00x 文件的情况下使用 Berkeley Db 事务?

Posted

技术标签:

【中文标题】如何在不记录/写入 __db.00x 文件的情况下使用 Berkeley Db 事务?【英文标题】:How to use Berkeley Db transactions without logging/writing to __db.00x files? 【发布时间】:2012-09-06 12:01:52 【问题描述】:

我正在开发一个使用 Berkeley Db 的应用程序。它必须符合 ACI(但不是 ACID),性能非常重要。不仅如此,性能是我选择 Berkeley Db 的原因。但现在 Berkeley Db 似乎因为日志记录而成为瓶颈。问题是数据库中存储的数据越多,要存储的值就越长。 我做

    envp->set_flags(envp, DB_TXN_NOSYNC, 1);

然后用flags打开环境:

    DB_CREATE     |  // Create the environment if it does not exist
    DB_INIT_TXN   |  // Initialize the transactional subsystem.
    DB_INIT_MPOOL |  // Initialize the memory pool (in-memory cache)
    DB_INIT_LOCK  |  // Initialize the locking subsystem
    DB_THREAD;

但它仍在记录到磁盘,并且性能变得非常差,因为数据量增加并且存储的值变得更长,我想,大部分时间都花在将它们保存到日志文件中 -平均负载是

load average: 19.65, 19.12, 17.00

我不需要在运行时同步任何日志——我只需要 ACI,而不需要 ACID。

有没有办法关闭日志或禁止将日志写入磁盘?

编辑:由于没有人回答,我搜索了很多并找到了 way 来关闭日志记录,但不幸的是,它没有帮助 - 环境仍然向 __db.00x 文件写入很多内容,而我没有不知道为什么以及如何让它在内存中。

【问题讨论】:

【参考方案1】:

您是否尝试过配置内存日志记录?请参考您提到的文档http://docs.oracle.com/cd/E17076_02/html/api_reference/C/envlog_set_config.html

envp->set_flags(envp, DB_LOG_IN_MEMORY, 1);

【讨论】:

【参考方案2】:

禁用 fsync(2) 是提高性能的一种方法。

编写一个返回 0 的存根例程并设置 fsync 向量 打开伯克利数据库时。

【讨论】:

以上是关于如何在不记录/写入 __db.00x 文件的情况下使用 Berkeley Db 事务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 setup.py 文件的情况下构建源代码分发?

如何在不覆盖现有记录的情况下将新行添加到数据表

如何在不将单独的帧图像写入磁盘的情况下从 C++ 程序中生成的多个图像编码视频?

如何在不使用对象的情况下连接字符串、整数和浮点数?

如何在不删除现有数据的情况下写入文件[重复]

如何在不重新打开文件的情况下读取然后写入/追加到文本文件?