当前位置: 首页 > 知识库问答 >
问题:

使用Cassandra的Spring Boot和Spring数据:在数据库连接失败时继续

沈茂
2023-03-14

我对Cassandra使用Spring Boot和Spring数据。在应用程序启动时,spring建立到数据库的连接,以设置模式并初始化spring数据存储库。如果数据库不可用,应用程序将无法启动。

我希望,应用程序只是记录一个错误并启动。当然,我不能再使用存储库了,但是其他独立于数据库的服务(rest控制器等)应该可以工作。在执行器健康检查中看到卡桑德拉倒下也很好。

@Configuration
public class CustomCassandraConfiguration extends CassandraAutoConfiguration {
    @Bean
    public DriverConfigLoaderBuilderCustomizer driverConfigLoaderBuilderCustomizer() {
        return builder -> builder.withBoolean(DefaultDriverOption.RECONNECT_ON_INIT, true);
    }
}
@Configuration
public class CustomCassandraAutoConfiguration extends CassandraAutoConfiguration {
private final Logger logger = LoggerFactory.getLogger(getClass());

@Override
@Bean
public CqlSession cassandraSession(CqlSessionBuilder cqlSessionBuilder) {
    try {
        return super.cassandraSession(cqlSessionBuilder);
    } catch (AllNodesFailedException e) {
        logger.error("Failed to establish the database connection", e);
    }
    return new DatabaseNotConnectedFakeCqlSession();
}

@Bean
public CassandraReactiveHealthIndicator cassandraHealthIndicator(ReactiveCassandraOperations r, CqlSession session) {
    if (session instanceof DatabaseNotConnectedFakeCqlSession) {
        return new CassandraReactiveHealthIndicator(r) {
            @Override
            protected Mono<Health> doHealthCheck(Health.Builder builder) {
                return Mono.just(builder.down().withDetail("connection", "was not available on startup").build());
            }
        };
    }
    return new CassandraReactiveHealthIndicator(r);
}
}
@Configuration
public class CustomCassandraDataAutoConfiguration extends CassandraDataAutoConfiguration {

public CustomCassandraDataAutoConfiguration(CqlSession session) {
    super(session);
}

@Bean
public SessionFactoryFactoryBean cassandraSessionFactory(CqlSession session, Environment environment, CassandraConverter converter) {
    SessionFactoryFactoryBean sessionFactoryFactoryBean = super.cassandraSessionFactory(environment, converter);

    // Disable schema action if database is not available
    if (session instanceof DatabaseNotConnectedFakeCqlSession) {
        sessionFactoryFactoryBean.setSchemaAction(SchemaAction.NONE);
    }
    return sessionFactoryFactoryBean;
}
}

DatabaseNotConnectedFakeCqlSession(假会话实现)

public class DatabaseNotConnectedFakeCqlSession implements CqlSession {
   
@Override
public String getName() {
    return null;
}

   
@Override
public Metadata getMetadata() {
    return null;
}

@Override
public boolean isSchemaMetadataEnabled() {
    return false;
}

   
@Override
public CompletionStage<Metadata> setSchemaMetadataEnabled( Boolean newValue) {
    return null;
}

   
@Override
public CompletionStage<Metadata> refreshSchemaAsync() {
    return null;
}

   
@Override
public CompletionStage<Boolean> checkSchemaAgreementAsync() {
    return null;
}

   
@Override
public DriverContext getContext() {
    return new DefaultDriverContext(new DefaultDriverConfigLoader(), ProgrammaticArguments.builder().build());
}

   
@Override
public Optional<CqlIdentifier> getKeyspace() {
    return Optional.empty();
}

   
@Override
public Optional<Metrics> getMetrics() {
    return Optional.empty();
}


@Override
public <RequestT extends Request, ResultT> ResultT execute( RequestT request, GenericType<ResultT> resultType) {
    return null;
}


@Override
public CompletionStage<Void> closeFuture() {
    return null;
}

   
@Override
public CompletionStage<Void> closeAsync() {
    return null;
}

   
@Override
public CompletionStage<Void> forceCloseAsync() {
    return null;
}

@Override
public Metadata refreshSchema() {
    return null;
}
}

有什么建议吗?

共有1个答案

尉迟彬
2023-03-14

[编辑]我昨晚已经在内部联系了DataStax车手团队,adutra已经做出了回应,所以我撤回了我的回应。

 类似资料:
  • 我在MySQL上有2个数据库。ge和GE_SC001。 我可以通过我的ASP.NET mvc应用程序在本地访问这两个。 Web.config null 稍后,当我在web服务器上部署应用程序,并尝试从本地机器访问它们时。我将server=localhost更改为机器的面向外部的IP地址。现在我只能访问一个GE。当我尝试访问第二个时,它会给我错误。 拒绝用户“root”@“对数据库”GE_SC001

  • 我试图连接到我的mongo数据库在我的远程服务器: 但我有一个错误: MongoDB外壳版本:2.6.10连接到:xxx。xxx。xxx。xx:27017/测试2016-11-07T05:18:39.140 0000警告:无法连接到xxx。xxx。xxx。xx:27017,原因:错误号:111连接被拒绝2016-11-07T05:18:39.142 0000错误:无法连接到服务器xxx。xxx。x

  • 我是拉威尔的新手,目前正在拉威尔的一个项目中工作。 当我在我的文件中使用'php工匠服务'来检查它是否工作/localhost,我得到了这个错误: (1/1)HttpException数据库连接失败! 在应用中。php第1014行 应用时- 在ScriptMint中中止时('399','数据库连接失败!')。php第31行 在ScriptMint- 在管道上- at XSP保护- 在管道上- 在T

  • 我刚刚从Ubuntu 10.04到12.04重新安装了我的操作系统,我在Ubuntu 10.04上使用了play 2.0.1,10.04上一切正常,但是现在同样的play 2.0.1把事情搞砸了,现在每次我运行命令服务器启动,但当我击中我的应用程序的索引页,它给我以下异常: 在参加这个论坛之前,我仔细检查了一下: mysql正在运行 配置文件有一些小改动:

  • 当我试图运行转发到连接到数据库的JSP的索引时,在JSP上出现了一个错误,数据库名称和一切都很好。 它给我的错误是 HTTP Status 500-内部服务器错误org.apache.jasper.jasperException:在第[25]行处理[/registration.jsp]时发生异常 22://它返回com.mysql.jdbc.driver.class。23:24: 25:java.

  • 我正在尝试使用JPa连接到我的mysql数据库。 我生成了persistance.xml: 并且通过这样做,intelij生成了POJO类: 我已经创建了实体管理器,并希望从中获得结果: 和路线: 然而,当我导航到localhost:8080/hi 它抛出 在浏览器和 控制台中。我不知道什么会导致这个问题,非常感谢所有的帮助