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

时间:2012-09-06 12:01:53

标签: performance logging transactions berkeley-db

我正在开发一个使用Berkeley Db的应用程序。它必须符合ACI(但不符合ACID),性能非常重要。更重要的是,表演是我选择伯克利Db的原因。但是现在Berkeley Db因为伐木而成为瓶颈。问题是数据库中存储的数据越多,要存储的值就越长。 我做了

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

然后使用标志打开环境:

    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文件,并且我不知道为什么以及如何让它在内存中。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

编写一个返回0的存根例程并设置fsync向量 在打开Berkeley DB时。