Skip to content

Cassandra with the Java driver

Uses the Apache Cassandra Java driver 4.19 (java-driver-core). The code is an ordinary application for the original database; nothing in it knows about MachNoSQL.

cass-1.example.com,cass-2.example.com
machnosql-1.example.com,machnosql-2.example.com

The address comes from the environment variable CASSANDRA_CONTACT_POINTS, so switching to MachNoSQL changes configuration only.

Terminal window
export CASSANDRA_CONTACT_POINTS='machnosql-1.example.com,machnosql-2.example.com'
mvn -q compile exec:java

Credentials come from CASSANDRA_USERNAME and CASSANDRA_PASSWORD, the local data center from CASSANDRA_DC (default dc1).

The program as it is kept and tested in the Mach Database NoSQL repository; highlighted lines read the connection setting.

src/main/java/example/App.java
// Sensor readings on Cassandra, unchanged on MachNoSQL.
package example;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
import com.datastax.oss.driver.api.core.cql.Row;
import java.net.InetSocketAddress;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
public final class App {
public static void main(String[] args) {
var builder = CqlSession.builder()
.withLocalDatacenter(System.getenv().getOrDefault("CASSANDRA_DC", "dc1"))
.withAuthCredentials(System.getenv("CASSANDRA_USERNAME"), System.getenv("CASSANDRA_PASSWORD"));
Arrays.stream(System.getenv("CASSANDRA_CONTACT_POINTS").split(","))
.forEach(host -> builder.addContactPoint(new InetSocketAddress(host.trim(), 9042)));
try (CqlSession session = builder.build()) {
session.execute("CREATE KEYSPACE IF NOT EXISTS iot WITH replication = "
+ "{'class': 'NetworkTopologyStrategy', 'dc1': 3}");
session.execute("CREATE TABLE IF NOT EXISTS iot.readings (sensor text, at timestamp, value double, "
+ "PRIMARY KEY (sensor, at)) WITH CLUSTERING ORDER BY (at DESC)");
session.execute("CREATE TABLE IF NOT EXISTS iot.sensors (sensor text PRIMARY KEY, owner text)");
PreparedStatement insert = session.prepare(
"INSERT INTO iot.readings (sensor, at, value) VALUES (?, ?, ?) USING TTL 86400");
Instant now = Instant.now();
for (int minute = 0; minute < 10; minute++) {
session.execute(insert.bind("s-1", now.minus(minute, ChronoUnit.MINUTES), 20.0 + minute / 10.0));
}
for (Row row : session.execute(
"SELECT at, value FROM iot.readings WHERE sensor = ? AND at > ? LIMIT 5",
"s-1", now.minus(5, ChronoUnit.MINUTES))) {
System.out.println(row.getInstant("at") + " " + row.getDouble("value"));
}
boolean applied = session.execute(
"INSERT INTO iot.sensors (sensor, owner) VALUES (?, ?) IF NOT EXISTS", "s-1", "ada").wasApplied();
System.out.println("registered: " + applied);
}
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.machnosql</groupId>
<artifactId>cassandra-example</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.release>21</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<exec.mainClass>example.App</exec.mainClass>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.cassandra</groupId>
<artifactId>java-driver-core</artifactId>
<version>4.19.4</version>
</dependency>
</dependencies>
</project>