Einführung in den DataStax Java-Treiber für Apache Cassandra

1. Übersicht

Die DataStax-Distribution von Apache Cassandra ist eine produktionsbereite verteilte Datenbank, die mit Open Source Cassandra kompatibel ist. Es werden einige Funktionen hinzugefügt, die in der Open-Source-Distribution nicht verfügbar sind, darunter Überwachung, verbesserte Stapelverarbeitung und Streaming-Datenverarbeitung.

DataStax bietet auch einen Java-Client für die Verteilung von Apache Cassandra. Dieser Treiber ist hochgradig abstimmbar und kann alle zusätzlichen Funktionen der DataStax-Distribution nutzen. Er ist jedoch auch vollständig mit der Open-Source-Version kompatibel.

In diesem Tutorial erfahren Sie, wie Sie mit dem DataStax Java-Treiber für Apache Cassandra eine Verbindung zu einer Cassandra-Datenbank herstellen und grundlegende Datenmanipulationen durchführen.

2. Maven-Abhängigkeit

Um den DataStax Java-Treiber für Apache Cassandra verwenden zu können, müssen Sie ihn in unseren Klassenpfad aufnehmen.

Mit Maven müssen wir einfach die Java-Treiber-Core- Abhängigkeit zu unserer pom.xml hinzufügen :

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

3. Verwenden des DataStax-Treibers

Nachdem wir den Treiber installiert haben, wollen wir sehen, was wir damit machen können.

3.1. Stellen Sie eine Verbindung zur Datenbank her

Um eine Verbindung zur Datenbank herzustellen, erstellen wir eine CqlSession :

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

Wenn wir keinen Kontaktpunkt explizit definieren, verwendet der Builder standardmäßig 127.0.0.1:9042 .

Erstellen wir eine Connector-Klasse mit einigen konfigurierbaren Parametern, um die CqlSession zu erstellen :

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. Keyspace erstellen

Nachdem wir eine Verbindung zur Datenbank hergestellt haben, müssen wir unseren Schlüsselraum erstellen. Beginnen wir mit dem Schreiben einer einfachen Repository-Klasse für die Arbeit mit unserem Schlüsselbereich.

In diesem Lernprogramm verwenden wir die SimpleStrategy- Replikationsstrategie mit der Anzahl der Replikate auf 1 :

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

Außerdem können wir den Schlüsselbereich in der aktuellen Sitzung verwenden :

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

3.3. Tabelle erstellen

Der Treiber stellt Anweisungen zum Konfigurieren und Ausführen von Abfragen in der Datenbank bereit. Zum Beispiel können wir den Schlüsselraum so einstellen, dass er in jeder Anweisung einzeln verwendet wird .

Wir definieren das Videomodell und erstellen eine Tabelle, um es darzustellen:

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

Erstellen wir unsere Tabelle mit der Möglichkeit, den Schlüsselbereich zu definieren, in dem die Abfrage ausgeführt werden soll. Wir werden eine einfache VideoRepository- Klasse für die Arbeit mit unseren Videodaten schreiben :

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); } // ... }

Beachten Sie, dass wir die Methode createTable überladen .

Die Idee hinter dem Überladen dieser Methode besteht darin, zwei Optionen für die Tabellenerstellung zu haben:

  • Erstellen Sie die Tabelle in einem bestimmten Schlüsselraum und senden Sie den Schlüsselraumnamen als Parameter, unabhängig davon, welcher Schlüsselraum die aktuell verwendete Sitzung ist
  • Beginnen Sie mit der Verwendung eines Schlüsselbereichs in der Sitzung und verwenden Sie die Methode für die Tabellenerstellung ohne Parameter. In diesem Fall wird die Tabelle in dem Schlüsselbereich erstellt, den die Sitzung derzeit verwendet

3.4. Daten einfügen

Darüber hinaus stellt der Treiber vorbereitete und begrenzte Anweisungen bereit.

Das PreparedStatement wird normalerweise für Abfragen verwendet, die häufig ausgeführt werden, wobei nur die Werte geändert werden.

Wir können das PreparedStatement mit den Werten füllen, die wir benötigen. Danach erstellen wir ein BoundStatement und führen es aus.

Schreiben wir eine Methode zum Einfügen einiger Daten in die Datenbank:

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. Daten abfragen

Fügen wir nun eine Methode hinzu, die eine einfache Abfrage erstellt, um die in der Datenbank gespeicherten Daten abzurufen:

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. Alles zusammenfügen

Schauen wir uns zum Schluss ein Beispiel für jeden Abschnitt an, den wir in diesem Tutorial behandelt haben:

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(); } }

Nachdem wir unser Beispiel ausgeführt haben, können wir in den Protokollen sehen, dass die Daten ordnungsgemäß in der Datenbank gespeichert wurden:

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. Fazit

In diesem Tutorial haben wir die grundlegenden Konzepte des DataStax Java-Treibers für Apache Cassandra behandelt. Wir haben eine Verbindung zur Datenbank hergestellt und einen Schlüsselbereich und eine Tabelle erstellt. Außerdem haben wir Daten in die Tabelle eingefügt und eine Abfrage ausgeführt, um sie abzurufen.

Wie immer ist der Quellcode für dieses Tutorial auf Github verfügbar.