![](/img/trans.png)
[英]connecting cassandra through ssl with datastax cassandra JAVA driver
[英]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.