java - Can't connect to Cassandra - Guava compatibility issue in Cassandra Datastax Driver 3.6
问题描述
I am using Cassandra driver 3.6.0 & Guava 19.0; I get the exception below:
[main] INFO com.datastax.driver.core - DataStax Java driver 3.6.0 for Apache Cassandra [main] INFO com.datastax.driver.core.GuavaCompatibility - Detected Guava >= 19 in the classpath, using modern compatibility layer [main] INFO com.datastax.driver.core.ClockFactory - Using native clock to generate timestamps. Exception in thread "main" com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/127.0.0.1:9042] Cannot connect), localhost/0:0:0:0:0:0:0:1:9042 (com.datastax.driver.core.exceptions.TransportException: [localhost/0:0:0:0:0:0:0:1:9042] Cannot connect)) at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:268)
I downgraded from Cassandra Core driver 20 to 19; I still get the above issue when I connect to the cluster from the client code.
pom.xml snippet
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-mapping</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
Java Driver
package com.cassandra.javaConnect;
import java.time.Instant;
import java.time.ZoneId;
import java.util.Date;
import java.util.UUID;
import com.datastax.driver.core.BoundStatement;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Session;
public class CassandraV3Tutorial {
private final static String KEYSPACE_NAME = "example_keyspace";
private final static String REPLICATION_STRATEGY = "SimpleStrategy";
private final static int REPLICATION_FACTOR = 1;
private final static String TABLE_NAME = "example_table";
public static void main(String[] args) {
// Setup a cluster to your local instance of Cassandra
Cluster cluster = Cluster.builder()
.addContactPoint("localhost")
.withPort(9042)
.build();
// Create a session to communicate with Cassandra
Session session = cluster.connect();
// Create a new Keyspace (database) in Cassandra
String createKeyspace = String.format(
"CREATE KEYSPACE IF NOT EXISTS %s WITH replication = " +
"{'class':'%s','replication_factor':%s};",
KEYSPACE_NAME,
REPLICATION_STRATEGY,
REPLICATION_FACTOR
);
session.execute(createKeyspace);
// Create a new table in our Keyspace
String createTable = String.format(
"CREATE TABLE IF NOT EXISTS %s.%s " + "" +
"(id uuid, timestamp timestamp, value double, " +
"PRIMARY KEY (id, timestamp)) " +
"WITH CLUSTERING ORDER BY (timestamp ASC);",
KEYSPACE_NAME,
TABLE_NAME
);
session.execute(createTable);
// Create an insert statement to add a new item to our table
PreparedStatement insertPrepared = session.prepare(String.format(
"INSERT INTO %s.%s (id, timestamp, value) values (?, ?, ?)",
KEYSPACE_NAME,
TABLE_NAME
));
// Some example data to insert
UUID id = UUID.fromString("1e4d26ed-922a-4bd2-85cb-6357b202eda8");
Date timestamp = Date.from(Instant.parse("2018-01-01T01:01:01.000Z"));
double value = 123.45;
// Bind the data to the insert statement and execute it
BoundStatement insertBound = insertPrepared.bind(id, timestamp, value);
session.execute(insertBound);
// Create a select statement to retrieve the item we just inserted
PreparedStatement selectPrepared = session.prepare(String.format(
"SELECT id, timestamp, value FROM %s.%s WHERE id = ?",
KEYSPACE_NAME,
TABLE_NAME));
// Bind the id to the select statement and execute it
BoundStatement selectBound = selectPrepared.bind(id);
ResultSet resultSet = session.execute(selectBound);
// Print the retrieved data
resultSet.forEach(row -> System.out.println(
String.format("Id: %s, Timestamp: %s, Value: %s",
row.getUUID("id"),
row.getTimestamp("timestamp").toInstant().atZone(ZoneId.of("UTC")),
row.getDouble("value"))));
// Close session and disconnect from cluster
session.close();
cluster.close();
}
}
解决方案
This error doesn't mean your Guava version is wrong. The message was introduced in cassandra-driver-core-3.2.0, see JAVA-1328 and JAVA-1435. INFO com.datastax.driver.core.GuavaCompatibility - Detected Guava >= 19 in the classpath, using modern compatibility layer
means the driver detected Guava 19+ and it's using some compat layer to operate. You're good to use Guava 20, or even any newer version.
Your error, on the other hand, means that the driver can't connect to your local Cassandra instance on port 9042. It's either not started, started on a different port or some software like firewall is blocking it. Please make sure cassandra process is working and use for example netstat
to see whether port 9042 is in use by Cassandra.
推荐阅读
- python - 如何在 django 模板中使用 django 模型对象?
- excel - 如何为桌面版重新加载 Excel 加载项
- html - 如何使用 Flexbox 将列堆叠在一起?无法让布局工作
- python - 在 Windows 中安装模块而不是在 Anaconda 中
- javascript - 如何使用我在此处显示的数据的按钮“排序”
- docker - 升级 VM RAM 后 BigBlueButton 崩溃
- node.js - 无法将图像/视频文件从 react-native 上传到 nodejs
- reactjs - How can I call some code after a property on my state object has been defined?
- java - 在Java中将反向ASCII转换为整数十进制
- javascript - 如何强制用户在 Angular 中仅上传特定的文件类型