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.