[英]Spring boot does not start when secondary datasource database connection unavailable
Caused by: java.lang.NullPointerException
at org.springframework.boot.actuate.endpoint.DataSourcePublicMetrics.initialize(DataSourcePublicMetrics.java:64) ~[spring-boot-actuator-1.3.2.RELEASE.jar:1.3.2.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_79]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_79]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_79]
at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_79]
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:354) ~[spring-beans-4.2.4.RELEASE.jar:4.2.4.RELEASE]
I disabled the metrics too but no luck 我也禁用了指标,但没有运气
endpoints.enabled=false
endpoints.autoconfig.enabled=false
endpoints.metrics.enabled=false
The DataSourcePublicMetrics
bean always gets created, even when the metrics are disabled. 即使禁用了度量标准,也始终会创建DataSourcePublicMetrics
bean。 This causes a NullPointerException
when the database connection is unavailable, causing spring boot not to start. 当数据库连接不可用时,这会导致NullPointerException
,导致spring boot无法启动。
I am using Hikari datasource and it fails to construct data source object when database is unavailable. 我正在使用Hikari数据源,当数据库不可用时,它无法构造数据源对象。 Hence NPE from DataSourcePublicMetrics bean. 因此来自DataSourcePublicMetrics bean的NPE。 I am able to circumvent the issue creating a Hikari data source that is lazy initialized with database config even when database is unavailable for later use when database becomes available. 我能够避免创建一个使用数据库配置初始化的Hikari数据源的问题,即使在数据库可用时数据库不可用以供以后使用时也是如此。 Not sure why HikariDataSource does not have a constructor for lazy init. 不知道为什么HikariDataSource没有lazy init的构造函数。 It does have a default constructor but database config can't be set using any setter method. 它有一个默认构造函数,但不能使用任何setter方法设置数据库配置。 This is useful for applications where database is not always necessary to start them up. 这对于不一定需要数据库来启动它们的应用程序非常有用。
public class LazyConnectionDataSource extends HikariDataSource {
public LazyConnectionDataSource(HikariConfig config) {
config.validate();
config.copyState(this);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.