簡體   English   中英

使用 Java 驅動程序連接到 Cassandra,出現錯誤“必須顯式設置本地 DC”

[英]Connecting to Cassandra with Java driver, getting error "local DC must be explicitly set"

我嘗試使用給定的參數創建連接。

CqlSessionBuilder builder = CqlSession.builder();
        int port = 9042;
        for ( String host : hosts ){
            int idx = host.indexOf(":");
            if ( idx > 0 ){
                port = Integer.parseInt( host.substring( idx +1).trim() );
                host = host.substring( 0, idx ).trim();
            }
            builder.addContactPoint( new InetSocketAddress( host, port ) );
            if (sslEnabled) {
                //builder.withSSL();
            }
        }
        if ( dataCenter != null ) builder.withLocalDatacenter( dataCenter );
        if ( userName != null && !userName.isEmpty() && password != null ) {
            builder.withAuthCredentials(userName, password);
        }
        return builder.build();

連接時,我收到此錯誤:

Since you provided explicit contact points, the local DC must be explicitly set.

代碼中有一個builder.withLocalDatacenter()。

有什么問題?

我看到的一件事是,您正在檢查dataCenter是否為null ,但您沒有檢查它是否為空。 因此,如果dataCenter等於"" (一個空字符串),它將通過對 null 的檢查,但仍無法應用有效的dataCenter 因此,像這樣在 Java 中驗證字符串被認為是一種更好的做法,而不是:

if ( dataCenter != null && !dataCenter.isEmpty() ) {
    builder.withLocalDatacenter( dataCenter );
}

但我認為這里的核心問題是dataCenter沒有獲得價值。 我會驗證的。

根據您提供的代碼片段, dataCenter未定義且尚未初始化。 結果,測試條件不滿足,因此withLocalDatacenter()不會被調用。

無論如何,如錯誤消息所述,您需要明確告訴驅動程序本地 DC 的名稱,因此檢查dataCenter是否為空或為空是不好的做法。

相反,您應該始終指定應用程序本地的數據中心。 例如:

datastax-java-driver {
  basic.load-balancing-policy {
    local-datacenter = DC1
  }
}

當然,當您以編程方式構建會話配置時,請始終調用withLocalDatacenter() ,例如:

CqlSession session = CqlSession.builder()
    .withLocalDatacenter("DC1")
    .build();

有關詳細信息,請參閱Java 驅動程序中的負載平衡

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM