Java 如何在禁用MongoDB但仍然安装的情况下运行Spring?
我正在阅读这期Git: 关于JavaSpring启动,我正在试图找到一种方法来绕过启动时的崩溃 简短的版本是,如果包含用于创建mongo客户端的代码:Java 如何在禁用MongoDB但仍然安装的情况下运行Spring?,java,spring,mongodb,spring-boot,spring-data,Java,Spring,Mongodb,Spring Boot,Spring Data,我正在阅读这期Git: 关于JavaSpring启动,我正在试图找到一种方法来绕过启动时的崩溃 简短的版本是,如果包含用于创建mongo客户端的代码: @Bean public MongoOperations mongoOperations() { try { //This runs an operation which uses my credentials to login to the db return new MongoTemplate(mong
@Bean
public MongoOperations mongoOperations() {
try {
//This runs an operation which uses my credentials to login to the db
return new MongoTemplate(mongoDbFactory());
} catch (Exception e){
e.printStackTrace();
return null;
}
}
并且MongoDB正在运行,它将连接并且没有任何问题,但是如果MongoDB没有运行,Spring将重试,再次失败后,将崩溃并停止所有启动序列
我的问题是:除了注释掉引用DB的所有代码外,还有没有其他方法可以绕过DB启动和运行时的初始崩溃/检查?我是否可以在底层捕获异常并让其通过?如果您的应用程序的行为方式是MongoDB是可选的,那么您有几个选项 如果要迁移现有的应用程序,从一开始最简单的方法就是自己创建基础结构。从
@Bean
方法返回null
的方式并不令人讨厌。相反,您可以使用一些可以延迟创建客户机的服务,并且您可以更新MongoDB的可选用法以通过该服务。服务将被创建,但仅在必要时创建底层基础设施
另一个选项是使用配置文件。如果主要用例是MongoDB可用,那么创建一个
应用程序nomongo.properties
(类似的内容),您可以使用spring.autoconfigure.exclude
属性排除自动配置。当应用程序在没有mongo的情况下启动时,您可以启用nomongo
配置文件,自动配置将退出。未启用时,Spring Boot将创建Mongo
bean。我也遇到了同样的问题。我希望我的应用程序也能够脱机运行,排队,并不时刷新到数据库。这意味着它需要能够离线启动,并在互联网可用时连接。Ofc,Spring在连接失败时使我的应用程序崩溃。
对我有效的是:
@Configuration
@EnableJpaRepositories(bootstrapMode = BootstrapMode.LAZY)
public class DataSourceConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("xxx");
hikariConfig.setJdbcUrl("xxx");
hikariConfig.setUsername("xxx");
hikariConfig.setPassword("xxx");
hikariConfig.setConnectionTestQuery("SELECT 1");
hikariConfig.setPoolName("springHikariCP");
hikariConfig.setInitializationFailTimeout(-1);
hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true");
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250");
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "2048");
hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
return dataSource;
}
@Bean
public EntityManager entityManager() {
return entityManagerFactory().getObject().createEntityManager();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("blabla");
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
em.setJpaProperties(additionalProperties());
return em;
}
private Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL55Dialect");
return properties;
}
}
此外,请将其放在应用程序类中
@SpringBootApplication(exclude = HibernateJpaAutoConfiguration.class)
application.yml如下所示:
#Spring properties
spring:
jpa:
hibernate:
ddl-auto: update
datasource:
url: "xxx"
username: xxx
password: xxx
driver-class-name: com.mysql.cj.jdbc.Driver
continue-on-error: true
hikari:
connection-timeout: 2000
initialization-fail-timeout: -1
auto-commit: true
这对我来说很有效,希望它也能对你们有用,我在这里看到很多帖子都在寻找解决方案。祝你好运 如果应用程序从启动时就使用数据库(或在启动时进行初始数据加载),它怎么能忽略数据库已关闭的事实呢?您可以尝试惰性地初始化Springbeans:在这种情况下,如果在运行时不使用mongoDb,则根本不会调用上面的代码。