我正在开发一个 Spring Boot 应用程序,该应用程序使用 Astra 安全捆绑包与 DataStax Astra DB 集成。然而,在尝试建立与数据库的连接时,我遇到了持续存在的问题,并且我已经花费了 20 多个小时来解决这个问题。尽管遵循了一些建议和步骤来解决该问题,但我仍然得到
ConnectionInitException
。
我已经能够使用 Python 直接连接到 Cassandra,因此我确信我的安全包已正确配置。
环境
问题 当我使用 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)]
此错误表明应用程序无法连接到数据库,即使我已确认正确引用了安全捆绑包和应用程序令牌。
我尝试过并验证过的内容
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
网络和端口:我已检查我的网络是否允许连接到 Astra DB。当使用 telnet 指定端口 29042 时,我能够建立连接,这排除了网络级问题。但是,在 Spring Boot 配置中硬编码端口并没有解决问题。
环境变量:我确认
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
Telnet 验证:我已使用 telnet 验证连接,并且能够连接到端口
29042
上的 Astra DB。这表明网络路径是开放的,问题可能出在 Spring Boot 应用程序配置中。
更新了依赖项:我更新了 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>
补充说明
请求帮助 我正在寻找有关如何正确配置 Spring Boot 和 Astra DB 之间的连接的任何建议。该问题是否与我的 Java 版本 (Java 22) 有关,或者我的配置中是否还缺少其他内容?
任何有关可能导致 ConnectionInitException 的原因的见解或进一步故障排除的建议将不胜感激。谢谢你。
我尝试了 mvn clean install,然后 mvn spring-boot:run 期望建立与 Cassandra 数据库的连接。
看起来安全捆绑包没有被拾取,所以它默认为
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 项目是一个完整的工作示例,您可以将其用作模板。干杯!