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

孤人 提交于 2021-02-07 09:33:43

问题


I don't want to install the full mongodb, so I created a simple spring-boot application with the following pom:

    <!-- 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>

It works fine, but on the application shutdown I lose all the data stored.

I noticed that the db is created inside of a temporary folder under C:\Users\myUser\AppData\Local\Temp\embedmongo-db-78beadc3-fa16-4101-afb1-ea7496f6f90c and, every time the application is restarted, another folder with different ID is created at the same location.

So, would it be possible to specify where the DB should be created so to keep the existing one and not lose all the data? Like you would do with h2 or sqllite?


回答1:


Now it's possible see it.

Next code just shows my solution to implement 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();
 }
}

In configuration class define that as a bean

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

At last, remove embedded mongodb autoconfiguration in your entry point

@SpringBootApplication(exclude = EmbeddedMongoAutoConfiguration.class)

PS: Remove from dependecies cz.jirutka.spring:embedmongo-spring

PSS: Tested on Spring-boot 2.0.0.RELEASE

PSSS: Also you can define path as a property in application.properties and also it in constructor




回答2:


The easiest way is to set the database-dir and oplog-size of the embedded mongo-db in the application.properties as described here: 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

I needed this as well and it works like a charm. Tested with spring-boot 2.2.5.RELEASE and de.flapdoodle.embed.mongo 2.2.0



来源:https://stackoverflow.com/questions/47185840/how-to-make-embedded-mongodb-keep-the-data-on-application-shutdown

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!