无法从我的Spring Boot 应用程序连接到Cassandra,抛出异常,因为无法到达任何联系点[已关闭]

mfuanj7w  于 2023-02-04  发布在  Cassandra
关注(0)|答案(1)|浏览(180)

3天前关闭。
Improve this question

    • 添加了配置文件以通过编程方式获取联系点**
@Bean(destroyMethod = "close")
    public CqlSession session() {
        CqlSession session = CqlSession.builder() 
            .addContactPoint(InetSocketAddress.createUnresolved("[240b:c0e0:1xx:xxx8:xxxx:x:x:x]", port))
                .withConfigLoader(
                        DriverConfigLoader.programmaticBuilder()
                                .withString(DefaultDriverOption.LOAD_BALANCING_LOCAL_DATACENTER, localDatacenter)                              .withString(DefaultDriverOption.AUTH_PROVIDER_USER_NAME,username)
                                .withString(DefaultDriverOption.AUTH_PROVIDER_PASSWORD,password)
                                .withString(DefaultDriverOption.CONNECTION_INIT_QUERY_TIMEOUT,"10s")
                                .withString(DefaultDriverOption.CONNECTION_CONNECT_TIMEOUT, "20s")
                                .withString(DefaultDriverOption.REQUEST_TIMEOUT, "20s")
                                .withString(DefaultDriverOption.CONTROL_CONNECTION_TIMEOUT, "20s")
                                .withString(DefaultDriverOption.SESSION_KEYSPACE,keyspace)
                                .build())
                //.addContactPoint(InetSocketAddress.createUnresolved(InetAddress.getByName(contactPoints).getHostName(), port))
                .build();
        }
        return session;

'原因是:org. springframework. bean. bean示例化异常:无法示例化[com. datastax. oss. driver. api. core. CqlSession]:工厂方法"cassandraSession"引发异常,消息为:由于您提供了显式联系点,因此必须显式设置本地DC(请参阅配置中的basic. load-balancing-policy. local-datacenter,或使用SessionBuilder. withLocalDatacenter以编程方式设置)。节点(端点=/127.0.0.1:9042,主机ID = 0323221f-9a0f-ec92-ea4a-c1472c2a8b94,哈希代码= 39075b16)=数据中心1。此群集中的当前DC为:数据中心1位于组织. springframework. beans.工厂.支持.简单示例化策略.示例化(简单示例化策略. java:171)~[ spring-beans-6.0.2.jar:6.0.2]位于组织. springframework. beans.工厂.支持.构造器解析器.示例化(构造器解析器. java:648)~[ spring-beans-6.0.2.jar:6.0.2]...省略了89个常见帧原因是:java.lang.IllegalStateException:由于您提供了显式联系点,因此必须显式设置本地DC(请参阅配置中的basic. load-balancing-policy. local-datacenter,或使用SessionBuilder. withLocalDatacenter以编程方式设置)。节点(端点=/127.0.0.1:9042,主机ID = 0323221f-9a0f-ec92-ea4a-c1472c2a8b94,哈希代码= 39075b16)=数据中心1。此群集中的当前DC为:数据中心1位于com.数据栈. oss.驱动程序.内部.核心.负载平衡.帮助程序.强制本地DcHelper.发现本地Dc(强制本地DcHelper.java:91)~[ java-驱动程序-核心-4.11.4-yb-1-RC1.jar:na]位于com.数据栈. oss.驱动程序.内部.核心.负载平衡.默认负载平衡策略.发现本地Dc(默认负载平衡策略. java:119)~[ java-驱动程序-核心-4.11.4-yb-1-RC1.jar:na]位于

    • 这是应用程序. yml文件**
spring:
  data:
    cassandra:
      keyspace-name: xxx
      contact-points: [xxxx:xxxx:xxxx:xxx:xxx:xxx]
      port: xxx
      local-datacenter: xxxx
      use-dc-aware: true
      username: xxxxx
      password: xxxxx
      ssl: true
      SchemaAction: CREATE_IF_NOT_EXISTS

但是应用程序仍然指向localhost,尽管我已经明确提到了联系点和localDC

    • stg事件的日志为:**

原因:com. datastax. oss. driver. api. core.所有节点失败异常:无法访问任何联系点,请确保您提供了有效的地址(显示前1个节点,使用getAllErrors()获取更多信息):节点(端点=/[ 240b:cOe0:102:xxxx:xxxx:x:x:x]:3xxx,主机ID为空,哈希代码= 4e9ba6a8):[com.数据栈.操作系统.驱动程序. api.核心.连接.连接初始化异常:[s0|控制ID:0x984419版本,L:/[ 240b:cOe0:102:5dd7:xxxx:x:x:xxx]:4xxx-R:/[ 240b:c0e0:102:xxxx:xxxx:x:x:x]:3xxx]协议初始化请求,步骤1(选项:意外的目标com. datax. oss. driver. apt. core.连接.关闭连接异常:与远程对等项的连接丢失)]

k97glaaz

k97glaaz1#

谢谢你的提问!
我将尝试提供一些可能帮助您识别问题的提示,但是应该注意的是,您的应用程序中似乎有一些非标准元素,我特别注意到"java-driver-core-4.11.4-yb-1-RC1.jar"不是DataStax发布的Java驱动程序工件(甚至没有4.11.4 Java驱动程序版本)。这可能与我们稍后讨论的原因有关。我也不认识你上面引用的配置文件。你能提供一些关于你的应用程序是如何配置的更多细节吗?乍看之下,您似乎在使用spring-data-cassandra,但在堆栈跟踪中没有任何提及......因此,也许您正在使用某种自定义配置代码?
关于你的具体问题:我猜想您的过渡环境中可能有一个Java驱动程序配置文件,它为"datastax-java-driver.basic.contact-points"提供了一个默认值。4.x Java驱动程序是通过Lightbend配置库配置的。与我们的情况最相关的是,它在类路径中搜索一组具有不同默认名称的配置文件;这些文件会被合并在一起,生成配置文件传递给驱动程序。2所以如果你有一个应用程序. conf在staging中,它指定了一些连接点,并且在类路径中,你上面引用的代码在你的本地环境中运行良好,但是在staging中失败了。
要验证这一点,请在本地环境的src/main/resources(或类路径中明确包含的其他位置)中创建一个application. conf文件,并为其提供以下内容:

datastax-java-driver {
  basic {
    contact-points: ["127.0.0.1:9042"]
  }
}

如果您在本地环境中重新运行该应用程序,您应该也会看到该错误。
注意,核心Java驱动程序JAR已经包含了一个reference.conf文件,作为默认配置。因为您没有使用标准的DataStax Java驱动程序JAR,我不知道您是否使用了在该JAR中定义的标准reference.conf文件。有 * 可能 * 在该文件中定义了联系点,尽管如果是这种情况,我希望您在使用该JAR的 * 任何 * 环境中都已经看到了该错误。
最后一点:Java驱动程序应该可以处理IPv6地址。上面描述的问题与IPv6无关;它完全取决于您如何使用Java驱动程序的配置机制。
希望上面的一些是有帮助的!

相关问题