我正在阅读这个Git问题: https://github.com/spring-projects/spring-boot/issues/7589 关于Java Spring引导的问题,并正在尝试找出一种在启动时绕过崩溃的方法。
简短的版本是,如果您包含用于创建mongo客户端的代码:
@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将重试,并且在再次失败后将崩溃并停止所有启动序列。
我的问题是:除了注释掉引用它的所有代码之外,是否有办法绕过此初始崩溃/检查数据库是否已启动并正在运行?我可以在低级别的某个地方捕获异常并让其通过吗?
答案 0 :(得分:2)
如果您的应用程序表现为MongoDB是可选的,则您有几种选择。
如果要迁移现有应用程序,那么最简单的方法就是从一开始就exclude the auto-configuration并自己创建基础结构。并非以您指示的从null
方法返回@Bean
的方式来,这是很讨厌的。相反,您可以拥有一些可以延迟创建客户端的服务,并且可以更新MongoDB的可选用法以通过该服务。无论如何都将创建该服务,但仅在必要时创建基础基础结构。
另一个选择是使用配置文件。如果主要用例是MongoDB可用,则创建一个application-nomongo.properties
(类似的东西),您将使用spring.autoconfigure.exclude
属性排除自动配置。当应用程序在没有mongo的情况下启动时,您可以启用nomongo
配置文件,并且自动配置将退出。如果未启用,则Mongo
bean将由Spring Boot创建。
答案 1 :(得分:1)
我有同样的问题。我希望我的应用程序也能够脱机运行,将内容排队并不时刷新到数据库。这意味着它需要能够脱机启动并在有互联网时连接。 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;
}
}
还将它放在您的App类中
@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
这对我有用,希望它也对你们也有用,我在这里看到很多帖子在寻找解决方案。祝你好运!