【问题标题】:How to make embedded mongodb keep the data on application shutdown?如何让嵌入式 mongodb 保留应用程序关闭时的数据?
【发布时间】:2017-11-08 17:17:30
【问题描述】:

我不想安装完整的 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 所做的那样?

【问题讨论】:

  • 只是出于好奇:为什么要选择专门设计用于针对数据大小进行多机部署的 DBMS > 单机可以存储什么,然后然后使用嵌入式版本它?即使在单元测试中,这也没有任何意义,因为应该在那里模拟 DB(“预期与实际行为”的事情,你知道),并且集成测试环境应该尽可能地类似于实际环境。阅读:与生产中相同的版本,相同的设置,必要时缩小规模。只是问...
  • 好吧,@MarkusWMahlberg,想象一下您的客户不想在他的环境中安装任何额外软件的情况,因为已经有太多事情需要处理了。而且你非常想在你的产品中使用数据库,因为它会让你的工作变得更容易。
  • @LiebsterKamerad 听起来像是“我想吃蛋糕。”在这两种情况下。至于客户,我做了相当多的需求管理,但这是我从未遇到过的需求。如果客户真的想要一个产品,他就要安装先决条件。至于开发人员,我会并且确实认为它没有。使用 Docker for Desktop 运行 MongoDB 实例实际上只需要一行 docker run -p 27017:27017 -n myMongo mongo,并且不会仅仅为了方便而引入依赖关系,同时消除了灵活性和可扩展性。
  • @MarkusWMahlberg 我完全同意你的看法,但至少对于我们的一些客户来说,Docker 也不是一个立即适用的选择(除了纯粹的官僚原因之外没有其他原因)。

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


【解决方案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 中的属性,也可以在构造函数中定义它

【讨论】:

    【解决方案2】:

    最简单的方法是在 application.properties 中设置嵌入式 mongo-db 的 database-dir 和 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 测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-11
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2017-04-14
      相关资源
      最近更新 更多