使用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。
验证步骤
- 启动应用并插入数据后,检查
.embeddedMongodbCustomPath目录下是否生成db相关文件(如collection-*.wt等)。 - 关闭应用后重新启动,检查是否能读取到之前插入的数据。
内容的提问来源于stack exchange,提问作者user1175801
相关产品推荐
相关产品推荐

