Introduzione al driver Java DataStax per Apache Cassandra

1. Panoramica

La distribuzione DataStax di Apache Cassandra è un database distribuito pronto per la produzione, compatibile con Cassandra open source. Aggiunge alcune funzionalità che non sono disponibili nella distribuzione open source, tra cui monitoraggio, batch migliorato e elaborazione dei dati in streaming.

DataStax fornisce anche un client Java per la sua distribuzione di Apache Cassandra. Questo driver è altamente configurabile e può sfruttare tutte le funzionalità extra della distribuzione DataStax, ma è anche completamente compatibile con la versione open-source.

In questo tutorial, vedremo come utilizzare DataStax Java Driver per Apache Cassandra per connettersi a un database Cassandra ed eseguire la manipolazione dei dati di base.

2. Dipendenza da Maven

Per poter utilizzare DataStax Java Driver per Apache Cassandra, dobbiamo includerlo nel nostro classpath.

Con Maven, dobbiamo semplicemente aggiungere la dipendenza java-driver-core al nostro pom.xml :

 com.datastax.oss java-driver-core 4.1.0   com.datastax.oss java-driver-query-builder 4.1.0 

3. Utilizzo del driver DataStax

Ora che abbiamo il driver a posto, vediamo cosa possiamo fare con esso.

3.1. Connettiti al database

Per connetterci al database, creeremo una CqlSession :

CqlSession session = CqlSession.builder().build();

Se non definiamo esplicitamente alcun punto di contatto, il builder per impostazione predefinita sarà 127.0.0.1:9042 .

Creiamo una classe connettore, con alcuni parametri configurabili, per costruire CqlSession :

public class CassandraConnector { private CqlSession session; public void connect(String node, Integer port, String dataCenter) { CqlSessionBuilder builder = CqlSession.builder(); builder.addContactPoint(new InetSocketAddress(node, port)); builder.withLocalDatacenter(dataCenter); session = builder.build(); } public CqlSession getSession() { return this.session; } public void close() { session.close(); } }

3.2. Crea Keyspace

Ora che abbiamo una connessione al database, dobbiamo creare il nostro keyspace. Cominciamo scrivendo una semplice classe di repository per lavorare con il nostro keyspace.

Per questo tutorial, utilizzeremo la strategia di replica SimpleStrategy con il numero di repliche impostato su 1 :

public class KeyspaceRepository { public void createKeyspace(String keyspaceName, int numberOfReplicas) { CreateKeyspace createKeyspace = SchemaBuilder.createKeyspace(keyspaceName) .ifNotExists() .withSimpleStrategy(numberOfReplicas); session.execute(createKeyspace.build()); } // ... }

Inoltre, possiamo iniziare a utilizzare il keyspace nella sessione corrente :

public class KeyspaceRepository { //... public void useKeyspace(String keyspace) { session.execute("USE " + CqlIdentifier.fromCql(keyspace)); } }

3.3. Crea tabella

Il driver fornisce istruzioni per configurare ed eseguire query nel database. Ad esempio, possiamo impostare lo spazio delle chiavi da utilizzare individualmente in ogni istruzione .

Definiremo il modello Video e creeremo una tabella per rappresentarlo:

public class Video { private UUID id; private String title; private Instant creationDate; // standard getters and setters }

Creiamo la nostra tabella, avendo la possibilità di definire il keyspace in cui vogliamo eseguire la query. Scriveremo una semplice classe VideoRepository per lavorare con i nostri dati video:

public class VideoRepository { private static final String TABLE_NAME = "videos"; public void createTable() { createTable(null); } public void createTable(String keyspace) { CreateTable createTable = SchemaBuilder.createTable(TABLE_NAME) .withPartitionKey("video_id", DataTypes.UUID) .withColumn("title", DataTypes.TEXT) .withColumn("creation_date", DataTypes.TIMESTAMP); executeStatement(createTable.build(), keyspace); } private ResultSet executeStatement(SimpleStatement statement, String keyspace) { if (keyspace != null) { statement.setKeyspace(CqlIdentifier.fromCql(keyspace)); } return session.execute(statement); } // ... }

Nota che stiamo sovraccaricando il metodo createTable .

L'idea alla base del sovraccarico di questo metodo è di avere due opzioni per la creazione della tabella:

  • Crea la tabella in uno specifico spazio delle chiavi, inviando il nome dello spazio delle chiavi come parametro, indipendentemente da quale spazio delle chiavi è attualmente utilizzato dalla sessione
  • Inizia a utilizzare uno spazio delle chiavi nella sessione e utilizza il metodo per la creazione della tabella senza alcun parametro: in questo caso, la tabella verrà creata nello spazio delle chiavi che la sessione sta attualmente utilizzando

3.4. Inserisci dati

Inoltre, il driver fornisce istruzioni preparate e limitate.

Il PreparedStatement viene in genere utilizzato per query eseguite spesso, con modifiche solo nei valori.

Possiamo riempire il PreparedStatement con i valori di cui abbiamo bisogno. Successivamente, creeremo un BoundStatement e lo eseguiremo.

Scriviamo un metodo per inserire alcuni dati nel database:

public class VideoRepository { //... public UUID insertVideo(Video video, String keyspace) { UUID videoId = UUID.randomUUID(); video.setId(videoId); RegularInsert insertInto = QueryBuilder.insertInto(TABLE_NAME) .value("video_id", QueryBuilder.bindMarker()) .value("title", QueryBuilder.bindMarker()) .value("creation_date", QueryBuilder.bindMarker()); SimpleStatement insertStatement = insertInto.build(); if (keyspace != null) { insertStatement = insertStatement.setKeyspace(keyspace); } PreparedStatement preparedStatement = session.prepare(insertStatement); BoundStatement statement = preparedStatement.bind() .setUuid(0, video.getId()) .setString(1, video.getTitle()) .setInstant(2, video.getCreationDate()); session.execute(statement); return videoId; } // ... }

3.5. Dati query

Ora aggiungiamo un metodo che crea una semplice query per ottenere i dati che abbiamo archiviato nel database:

public class VideoRepository { // ... public List selectAll(String keyspace) { Select select = QueryBuilder.selectFrom(TABLE_NAME).all(); ResultSet resultSet = executeStatement(select.build(), keyspace); List result = new ArrayList(); resultSet.forEach(x -> result.add( new Video(x.getUuid("video_id"), x.getString("title"), x.getInstant("creation_date")) )); return result; } // ... }

3.6. Mettere tutto insieme

Infine, vediamo un esempio utilizzando ciascuna sezione che abbiamo trattato in questo tutorial:

public class Application { public void run() { CassandraConnector connector = new CassandraConnector(); connector.connect("127.0.0.1", 9042, "datacenter1"); CqlSession session = connector.getSession(); KeyspaceRepository keyspaceRepository = new KeyspaceRepository(session); keyspaceRepository.createKeyspace("testKeyspace", 1); keyspaceRepository.useKeyspace("testKeyspace"); VideoRepository videoRepository = new VideoRepository(session); videoRepository.createTable(); videoRepository.insertVideo(new Video("Video Title 1", Instant.now())); videoRepository.insertVideo(new Video("Video Title 2", Instant.now().minus(1, ChronoUnit.DAYS))); List videos = videoRepository.selectAll(); videos.forEach(x -> LOG.info(x.toString())); connector.close(); } }

Dopo aver eseguito il nostro esempio, di conseguenza, possiamo vedere nei log che i dati sono stati correttamente memorizzati nel database:

INFO com.baeldung.datastax.cassandra.Application - [id:733249eb-914c-4153-8698-4f58992c4ad4, title:Video Title 1, creationDate: 2019-07-10T19:43:35.112Z] INFO com.baeldung.datastax.cassandra.Application - [id:a6568236-77d7-42f2-a35a-b4c79afabccf, title:Video Title 2, creationDate: 2019-07-09T19:43:35.181Z]

4. Conclusione

In questo tutorial, abbiamo trattato i concetti di base del driver Java DataStax per Apache Cassandra. Ci siamo collegati al database e abbiamo creato uno spazio per le chiavi e una tabella. Inoltre, abbiamo inserito i dati nella tabella ed eseguito una query per recuperarli.

Come sempre, il codice sorgente di questo tutorial è disponibile su Github.