Spring Boot Cassandra 连接问题:无法连接到 DataStax Astra DB

问题描述 投票:0回答:1

我正在开发一个 Spring Boot 应用程序,该应用程序使用 Astra 安全捆绑包与 DataStax Astra DB 集成。然而,在尝试建立与数据库的连接时,我遇到了持续存在的问题,并且我已经花费了 20 多个小时来解决这个问题。尽管遵循了一些建议和步骤来解决该问题,但我仍然得到

ConnectionInitException

我已经能够使用 Python 直接连接到 Cassandra,因此我确信我的安全包已正确配置。

环境

  • Java版本:Java 22(也降级到Java 17并发生完全相同的错误)
  • Spring Boot版本:3.2.5
  • Maven:最新版本
  • Spring Data Cassandra:使用 spring-boot-starter-data-cassandra
  • Astra DB Secure Bundle:在 application.yaml 文件中指定

问题 当我使用 mvn spring-boot:run 运行 Spring Boot 应用程序时,我在日志中收到以下错误:

Node(endPoint=/127.0.0.1:9042, hostId=null, hashCode=58cd994e): 
[com.datastax.oss.driver.api.core.connection.ConnectionInitException: [s0|control|connecting...] Protocol initialization request, step 1 (OPTIONS): failed to send request (io.netty.channel.StacklessClosedChannelException)]

此错误表明应用程序无法连接到数据库,即使我已确认正确引用了安全捆绑包和应用程序令牌。

我尝试过并验证过的内容

  1. Java 版本:我使用的是 Java 22。最初建议我尝试降级到 Java 17,因为 Spring 应用程序更普遍支持它。然而,切换到 Java 17 可能会导致我的系统出现其他问题,所以我还没有探索这个选项。
  2. 安全捆绑包:安全连接捆绑包放置在正确的目录中,如 application.yaml 中指定的:
  3. 端口:29042:在看到一些相关的 StackOverflow 帖子和解决方案后,我尝试将 application.yaml 文件中的端口设置为端口 29042。没成功。
astra:
  secure-connect-bundle: /path/to/secure-connect-database.zip
  application-token: AstraCS:<masked_token>
  keyspace: default_keyspace

该捆绑包位于

src/main/resources/secure-connect-database.zip

  1. 网络和端口:我已检查我的网络是否允许连接到 Astra DB。当使用 telnet 指定端口 29042 时,我能够建立连接,这排除了网络级问题。但是,在 Spring Boot 配置中硬编码端口并没有解决问题。

  2. 环境变量:我确认

    ASTRA_DB_ID
    ASTRA_DB_REGION
    ASTRA_DB_APPLICATION_TOKEN
    等环境变量有效,因为我能够使用Python成功连接到数据库。这是我的
    .env
    文件中的片段:

ASTRA_DB_ID=<masked_db_id>
ASTRA_DB_REGION=<masked_region>
ASTRA_DB_KEYSPACE=default_keyspace
ASTRA_DB_APPLICATION_TOKEN=AstraCS:<masked_token>
ASTRA_DB_SECURE_CONNECT_BUNDLE_PATH=/path/to/secure-connect-database.zip
  1. Telnet 验证:我已使用 telnet 验证连接,并且能够连接到端口

    29042
    上的 Astra DB。这表明网络路径是开放的,问题可能出在 Spring Boot 应用程序配置中。

  2. 更新了依赖项:我更新了 Maven

    pom.xml
    文件,以确保我使用 Spring Boot、Cassandra 驱动程序和其他相关库的正确版本的依赖项。

详细错误 错误日志显示尝试实例化

CassandraDataAutoConfiguration
CqlSession
类失败。这是错误日志的片段:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration': 
Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'cassandraSession' defined in class path resource [org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.class]: 
Failed to instantiate [com.datastax.oss.driver.api.core.CqlSession]: Factory method 'cassandraSession' threw exception with message: Could not reach any contact point, make sure you've provided valid addresses.

application.yaml 这是

application.yaml
文件的相关部分:

astra:
  secure-connect-bundle: /path/to/secure-connect-database.zip
  application-token: AstraCS:<masked_token>
  keyspace: default_keyspace

pom.xml 这是我的

pom.xml
中的当前配置:

<properties>
    <java.version>22</java.version>
</properties>

<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Data Cassandra -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-cassandra</artifactId>
    </dependency>

    <!-- DataStax Java Driver Core -->
    <dependency>
        <groupId>com.datastax.oss</groupId>
        <artifactId>java-driver-core</artifactId>
        <version>4.14.1</version>
    </dependency>
</dependencies>

补充说明

  1. 指定端口:我尝试在各种配置中对端口29042进行硬编码,但似乎并不能帮助解决问题。最初,似乎指定端口解决了一些网络问题,但连接错误仍然存在。
  2. 其他上下文:我之前能够使用相同的凭据和与 Python 的安全捆绑包连接到 Astra DB,这确认了凭据和数据库设置是正确的。

请求帮助 我正在寻找有关如何正确配置 Spring Boot 和 Astra DB 之间的连接的任何建议。该问题是否与我的 Java 版本 (Java 22) 有关,或者我的配置中是否还缺少其他内容?

任何有关可能导致 ConnectionInitException 的原因的见解或进一步故障排除的建议将不胜感激。谢谢你。

我尝试了 mvn clean install,然后 mvn spring-boot:run 期望建立与 Cassandra 数据库的连接。

spring-boot datastax datastax-java-driver spring-data-cassandra datastax-astra
1个回答
0
投票

看起来安全捆绑包没有被拾取,所以它默认为

localhost

Node(endPoint=/127.0.0.1:9042, hostId=null, hashCode=58cd994e): ...

尝试删除

application.yaml
中的捆绑包路径,使其仅包含文件名,例如:

astra:
  secure-connect-bundle: secure-connect-db_name.zip
  application-token: AstraCS:<masked_token>
  keyspace: default_keyspace

此外,不要设置端口,因为驱动程序从安全包中获取该信息。

如果有帮助,GitHub 上的 spring-data-starter 项目是一个完整的工作示例,您可以将其用作模板。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.