如何使嵌入式 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
进行测试
我不想安装完整的 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
进行测试