如何使嵌入式 mongodb 在应用程序关闭时保留数据?

How to make embedded mongodb keep the data on application shutdown?

我不想安装完整的 mongodb,所以我使用以下 pom 创建了一个简单的 spring-boot 应用程序:

    <!-- This dependency is to have an embedded mongodb -->
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <version>1.50.5</version>
    </dependency>

    <!-- while this provides a spring factory bean for the embedded mongodb -->
    <dependency>
        <groupId>cz.jirutka.spring</groupId>
        <artifactId>embedmongo-spring</artifactId>
        <version>RELEASE</version>
    </dependency>

    <!-- finally this one is the spring-boot starter for mongodb -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
        <version>${spring.boot.version}</version>
     </dependency>

它工作正常,但在应用程序关闭时我丢失了所有存储的数据

我注意到数据库是在一个临时文件夹中创建的 C:\Users\myUser\AppData\Local\Temp\embedmongo-db-78beadc3-fa16-4101-afb1-ea7496f6f90c 而且,每次重新启动应用程序时,都会在同一位置创建另一个具有不同 ID 的文件夹。

那么,是否可以指定应该在何处创建数据库以保留现有数据库而不丢失所有数据?就像您使用 h2 或 sqllite 一样?

现在可以it

接下来的代码只是展示了我的实现方案。

public class MongoInMemory {
 private int port;
 private String host;
 private MongodProcess process = null;

 public MongoInMemory(int port, String host){
    this.port = port;
    this.host = host;
 }

 @PostConstruct
 public void init() throws IOException {
    Storage storage = new Storage(
            System.getProperty("user.home") + "/.ttraining-storage", null, 0);

    IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
            .defaults(Command.MongoD)
            .artifactStore(new ExtractedArtifactStoreBuilder()
                    .defaults(Command.MongoD)
                    .download(new DownloadConfigBuilder()
                            .defaultsForCommand(Command.MongoD).build())
                    .executableNaming(new UserTempNaming()))
            .build();

    IMongodConfig mongodConfig = new MongodConfigBuilder()
            .version(Version.Main.PRODUCTION)
            .net(new Net(host, port, false))
            .replication(storage)
            .build();

    MongodStarter runtime = MongodStarter.getInstance(runtimeConfig);
    process = runtime.prepare(mongodConfig).start();
 }

 @PreDestroy
 public void stop(){
    process.stop();
 }
}

在配置中 class 将其定义为 bean

@Bean
public MongoInMemory mongoInMemory(
    @Value("${spring.data.mongodb.port}") int port,
    @Value("${spring.data.mongodb.host}")  String host) {
        return new MongoInMemory(port, host)
}

最后,删除入口点中嵌入的mongodb自动配置

@SpringBootApplication(exclude = EmbeddedMongoAutoConfiguration.class)

PS: 从依赖项中移除 cz.jirutka.spring:embedmongo-spring

PSS:在 Spring-boot 2.0.0.RELEASE

上测试

PSSS:您还可以在 application.properties 中将路径定义为 属性,在构造函数

中也可以将路径定义为 属性

最简单的方法是在 application.properties 中设置嵌入式 mongo-db 的数据库目录和操作日志大小,如下所述:http://sahits.ch/blog/openpatrician/2017/05/20/embedded-databases-for-statistic-storage/

spring.mongodb.embedded.storage.database-dir=your-dir-name
spring.mongodb.embedded.storage.oplog-size=0

我也需要这个,它非常有用。使用 spring-boot 2.2.5.RELEASE 和 de.flapdoodle.embed.mongo 2.2.0

进行测试