You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用de.flapdoodle.embed.mongo持久化数据失败求助

问题排查与解决方案

1. 解决Journaling异常

你遇到的cannot use 'j' option when a host does not have journaling enabled错误,是因为MongoClient配置了WriteConcern.JOURNALED,但嵌入式MongoDB默认未启用journaling功能。

修复方案二选一:

  • 方案一:修改MongoClient配置,移除Journaled写关注
    将WriteConcern.JOURNALED替换为默认的WriteConcern.ACKNOWLEDGED:
    MongoClientOptions options = MongoClientOptions.builder()
            .codecRegistry(codecRegistry)
            .writeConcern(WriteConcern.ACKNOWLEDGED)
            .build();
    
  • 方案二:启动嵌入式Mongo时启用journaling
    在Mongod builder中添加journaling配置:
    TransitionWalker.ReachedState<RunningMongodProcess> running = Mongod.builder()
            .net(Start.to(Net.class)
                    .initializedWith(Net.defaults().withPort(37017)))
            .persistentBaseDir(mongod.persistentBaseDir())
            .cmdOptions(Start.to(MongodCmdOptions.class)
                    .initializedWith(MongodCmdOptions.defaults().useJournal(true))) // 启用journaling
            .build()
            .start(Version.V6_0_1);
    

2. 修复数据持久化丢失问题

你已配置持久化目录但数据仍丢失,核心原因是未明确指定MongoDB的数据库存储路径(dbPath),嵌入式Mongo默认可能使用临时目录覆盖了你的持久化配置。

完整修复后的启动代码:

// 定义持久化目录
PersistentDir persistentDir = PersistentDir.inUserHome(".embeddedMongodbCustomPath")
        .mapToUncheckedException(RuntimeException::new)
        .get();

// 构建并启动MongoDB,明确指定dbPath并启用持久化
TransitionWalker.ReachedState<RunningMongodProcess> running = Mongod.builder()
        .net(Start.to(Net.class)
                .initializedWith(Net.defaults().withPort(37017)))
        .storage(Start.to(Storage.class)
                .initializedWith(Storage.defaults()
                        .withDbPath(persistentDir.asFile()) // 指定dbPath为自定义持久化目录
                        .withPersistence(true))) // 开启持久化
        .cmdOptions(Start.to(MongodCmdOptions.class)
                .initializedWith(MongodCmdOptions.defaults()
                        .useJournal(true))) // 可选,若保留Journaled写关注则启用
        .build()
        .start(Version.V6_0_1);

关键配置说明:

  • storage().withDbPath(persistentDir.asFile()):将MongoDB的数据存储目录直接指向你定义的自定义路径,确保数据写入该目录而非临时目录。
  • storage().withPersistence(true):显式开启持久化模式,避免嵌入式Mongo使用内存或临时存储。
  • 若选择保留WriteConcern.JOURNALED,则必须配合cmdOptions().useJournal(true)启用journaling。

验证步骤

  1. 启动应用并插入数据后,检查.embeddedMongodbCustomPath目录下是否生成db相关文件(如collection-*.wt等)。
  2. 关闭应用后重新启动,检查是否能读取到之前插入的数据。

内容的提问来源于stack exchange,提问作者user1175801

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:23:32