Introduktion til DataStax Java Driver til Apache Cassandra

1. Oversigt

DataStax-distributionen af ​​Apache Cassandra er en produktionsklar distribueret database, der er kompatibel med open source-Cassandra. Det tilføjer et par funktioner, der ikke er tilgængelige i open source-distributionen, herunder overvågning, forbedret batch og streaming databehandling.

DataStax leverer også en Java-klient til distribution af Apache Cassandra. Denne driver er meget tunbar og kan drage fordel af alle de ekstra funktioner i DataStax-distributionen, men alligevel er den også fuldt kompatibel med open source-versionen.

I denne vejledning ser vi hvordan man bruger DataStax Java Driver til Apache Cassandra at oprette forbindelse til en Cassandra-database og udføre grundlæggende databehandling.

2. Maven-afhængighed

For at kunne bruge DataStax Java Driver til Apache Cassandra er vi nødt til at inkludere den i vores klassesti.

Med Maven er vi simpelthen nødt til at tilføje java-driver-kerne afhængighed af vores pom.xml:

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

3. Brug af DataStax-driveren

Nu hvor vi har chaufføren på plads, lad os se, hvad vi kan gøre med den.

3.1. Opret forbindelse til databasen

For at få forbindelse til databasen opretter vi en CqlSession:

CqlSession-session = CqlSession.builder (). Build ();

Hvis vi ikke eksplicit definerer noget kontaktpunkt, er bygherren som standard 127.0.0.1:9042.

Lad os oprette en stikklasse med nogle konfigurerbare parametre til at opbygge CqlSession:

offentlig klasse CassandraConnector {privat CqlSession-session; public void connect (String node, Integer port, String dataCenter) {CqlSessionBuilder builder = CqlSession.builder (); builder.addContactPoint (ny InetSocketAddress (node, port)); builder.withLocalDatacenter (dataCenter); session = builder.build (); } public CqlSession getSession () {returner this.session; } offentlig tomrum lukket () {session.close (); }}

3.2. Opret Keyspace

Nu hvor vi har forbindelse til databasen, skal vi oprette vores nøgleområde. Lad os starte med at skrive en simpel arkivklasse til at arbejde med vores nøgleområde.

Til denne vejledning, vi bruger SimpleStrategy replikeringsstrategi med antallet af repliker indstillet til 1:

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

Det kan vi også start med at bruge nøgleområdet i den aktuelle session:

offentlig klasse KeyspaceRepository {// ... public void useKeyspace (String keypace) {session.execute ("USE" + CqlIdentifier.fromCql (keypace)); }}

3.3. Opret tabel

Driveren giver udsagn til konfiguration og udførelse af forespørgsler i databasen. For eksempel, vi kan indstille nøgleområdet til at bruge individuelt i hver sætning.

Vi definerer Video model og opret en tabel til at repræsentere den:

offentlig klasse video {privat UUID id; privat streng titel; privat Øjeblikkelig skabelsesdato; // standard getters og setter}

Lad os oprette vores tabel med mulighed for at definere det nøgleområde, hvor vi vil udføre forespørgslen. Vi skriver en simpel VideoRepository klasse til at arbejde med vores videodata:

offentlig klasse VideoRepository {privat statisk endelig String TABLE_NAME = "videoer"; public void createTable () {createTable (null); } public void createTable (String keypace) {CreateTable createTable = SchemaBuilder.createTable (TABLE_NAME) .withPartitionKey ("video_id", DataTypes.UUID) .withColumn ("title", DataTypes.TEXT) .withColumn ("creation_dateT, Data ); executeStatement (createTable.build (), nøgleområde); } privat ResultSet executeStatement (SimpleStatement-sætning, String-nøgleområde) {if (keypace! = null) {statement.setKeyspace (CqlIdentifier.fromCql (keypace)); } returner session. udfør (erklæring); } // ...}

Bemærk, at vi overbelaster metoden createTable.

Ideen bag overbelastning af denne metode er at have to muligheder for oprettelse af bordet:

  • Opret tabellen i et bestemt nøgleområde, og send navnet på nøgleområdet som parameter, uafhængigt af hvilket nøgleområde der er den session, der aktuelt bruger
  • Begynd at bruge et nøgleområde i sessionen, og brug metoden til oprettelse af tabellen uden nogen parameter - i dette tilfælde oprettes tabellen i det nøgleområde, som sessionen i øjeblikket bruger

3.4. Indsæt data

Derudover leverer føreren udarbejdede og afgrænsede erklæringer.

Det PreparedStatement bruges typisk til forespørgsler, der udføres ofte med ændringer i værdierne.

Vi kan fylde PreparedStatement med de værdier, vi har brug for. Derefter opretter vi en BoundStatement og udfør det.

Lad os skrive en metode til at indsætte nogle data i databasen:

public class VideoRepository {// ... public UUID insertVideo (Video video, String keypace) {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 (keypace! = null) {insertStatement = insertStatement.setKeyspace (keypace); } PreparedStatement preparedStatement = session.prepare (insertStatement); BoundStatement-sætning = preparedStatement.bind () .setUuid (0, video.getId ()) .setString (1, video.getTitle ()) .setInstant (2, video.getCreationDate ()); session.execute (erklæring); returner videoId; } // ...}

3.5. Forespørgselsdata

Lad os nu tilføje en metode, der opretter en simpel forespørgsel for at hente de data, vi har gemt i databasen:

public class VideoRepository {// ... public List selectAll (String keypace) {Select select = QueryBuilder.selectFrom (TABLE_NAME) .all (); ResultSet resultSet = executeStatement (select.build (), nøgleområde); Listeresultat = ny ArrayList (); resultSet.forEach (x -> result.add (ny video (x.getUuid ("video_id"), x.getString ("titel"), x.getInstant ("creation_date")))); returresultat } // ...}

3.6. Samler det hele

Lad os endelig se et eksempel ved hjælp af hvert afsnit, vi har dækket i denne vejledning:

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

Efter at vi har udført vores eksempel som et resultat, kan vi se i logfilerne, at dataene blev gemt korrekt i databasen:

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

I denne vejledning dækkede vi de grundlæggende begreber i DataStax Java Driver til Apache Cassandra. Vi oprettede forbindelse til databasen og oprettede et nøgleområde og en tabel. Vi indsatte også data i tabellen og kørte en forespørgsel for at hente dem.

Som altid er kildekoden til denne vejledning tilgængelig på Github.