3

使用java库,任何配置更改都可以在不需要重新打开数据库的情况下生效吗?例如level0SlowdownWritesTrigger.

更多上下文:我正在尝试在批量加载模式和常规模式之间切换。例如,在应用启动时禁用自动压缩,加载数据,然后启用自动压缩。在测试中,这使我的初始加载时间减少了 75%。
问题是更改Options不会生效,至少在我制作它们的方式上。我不想重新打开数据库,因为这会使现有的数据流处理复杂化。

我试过的示例代码。在此示例中,我正在更改选项中的自动压缩设置。

import org.rocksdb.ColumnFamilyOptions
import org.rocksdb.DBOptions
import org.rocksdb.Options
import org.rocksdb.RocksDB

class ExampleRocksDbStore(
    private val dataDirectory: String,
    private val configureOptions: (options: Options) -> Unit = {},
) {

    val db: RocksDB
    val options: Options

    init {
        RocksDB.loadLibrary()

        ColumnFamilyOptions().use { cfOpts ->
            val dbOptions = DBOptions()

            options = Options(dbOptions, cfOpts).apply {
                setCreateIfMissing(true)
                setCreateMissingColumnFamilies(true)
            }
            configureOptions(options)

            db = RocksDB.open(options, dataDirectory)
        }
    }

    fun enableAutoCompaction() {
        options.setDisableAutoCompactions(false)
    }

    fun disableAutoCompaction() {
        options.setDisableAutoCompactions(true)
    }
}
4

1 回答 1

0

动态可变的选项是一回事,基本操作 wiki提到了它们:

某些选项可以在 DB 运行时动态更改。例如: ...

我能找到这些选项的唯一记录在options.h 这里,有多个选项标记为“//通过 SetOptions() API 动态更改”,并且disable_automatic_compactions 是其中之一

所以我认为您只需要更改您的Options对象,然后调用setOptions()您的 RocksDB 实例,除非您已经这样做并且它不起作用?

于 2021-11-22T16:20:46.527 回答