简体   繁体   English

当辅助数据源数据库连接不可用时,Spring启动不会启动

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM