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

时间:2017-11-08 17:17:30

标签: java spring mongodb spring-boot embedded-database

我不想安装完整的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>

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

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

那么,是否可以指定创建数据库的位置以保留现有数据并且不丢失所有数据?就像你使用h2或sqllite一样?

2 个答案:

答案 0 :(得分:1)

现在可以查看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();
 }
}

在配置类中将其定义为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中将路径定义为属性,也可以在构造函数中将其定义为

答案 1 :(得分:0)

最简单的方法是在application.properties中设置嵌入式mongo-db的数据库目录和oplog-size,如下所述: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中进行了测试