Introduction au pilote Java DataStax pour Apache Cassandra

1. Vue d'ensemble

La distribution DataStax d'Apache Cassandra est une base de données distribuée prête pour la production, compatible avec Cassandra open-source. Il ajoute quelques fonctionnalités qui ne sont pas disponibles dans la distribution open-source, notamment la surveillance, l'amélioration des lots et le traitement des données en continu.

DataStax fournit également un client Java pour sa distribution d'Apache Cassandra. Ce pilote est hautement paramétrable et peut tirer parti de toutes les fonctionnalités supplémentaires de la distribution DataStax, mais il est également entièrement compatible avec la version open-source.

Dans ce didacticiel, nous verrons comment utiliser le pilote Java DataStax pour Apache Cassandra pour se connecter à une base de données Cassandra et effectuer une manipulation de données de base.

2. Dépendance de Maven

Afin d'utiliser le pilote Java DataStax pour Apache Cassandra, nous devons l'inclure dans notre chemin de classe.

Avec Maven, nous devons simplement ajouter la dépendance java-driver-core à notre pom.xml :

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

3. Utilisation du pilote DataStax

Maintenant que nous avons le pilote en place, voyons ce que nous pouvons en faire.

3.1. Connectez-vous à la base de données

Afin de se connecter à la base de données, nous allons créer une CqlSession :

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

Si nous ne définissons explicitement aucun point de contact, le générateur sera par défaut 127.0.0.1:9042 .

Créons une classe de connecteur, avec quelques paramètres configurables, pour construire la 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. Créer un espace clé

Maintenant que nous avons une connexion à la base de données, nous devons créer notre espace de clés. Commençons par écrire une classe de référentiel simple pour travailler avec notre espace de clés.

Pour ce didacticiel, nous utiliserons la stratégie de réplication SimpleStrategy avec le nombre de réplicas défini sur 1 :

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

De plus, nous pouvons commencer à utiliser l'espace de clés dans la session en cours :

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

3.3. Créer une table

Le pilote fournit des instructions pour configurer et exécuter des requêtes dans la base de données. Par exemple, nous pouvons définir l'espace de clés à utiliser individuellement dans chaque instruction .

Nous allons définir le modèle vidéo et créer un tableau pour le représenter:

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

Créons notre table, en ayant la possibilité de définir l'espace de clés dans lequel nous voulons effectuer la requête. Nous allons écrire une classe VideoRepository simple pour travailler avec nos données vidéo:

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

Notez que nous surchargons la méthode createTable .

L'idée derrière la surcharge de cette méthode est d'avoir deux options pour la création de la table:

  • Créer la table dans un espace de clés spécifique, en envoyant le nom de l'espace de clés en tant que paramètre, indépendamment de l'espace de clés utilisé par la session
  • Commencez à utiliser un espace de clés dans la session et utilisez la méthode de création de table sans aucun paramètre - dans ce cas, la table sera créée dans l'espace de clés que la session utilise actuellement

3.4. Insérer des données

De plus, le pilote fournit des instructions préparées et limitées.

Le PreparedStatement est généralement utilisé pour les requêtes exécutées souvent, avec des modifications uniquement dans les valeurs.

Nous pouvons remplir le PreparedStatement avec les valeurs dont nous avons besoin. Après cela, nous allons créer un BoundStatement et l'exécuter.

Écrivons une méthode pour insérer des données dans la base de données:

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. Requête de données

Maintenant, ajoutons une méthode qui crée une requête simple pour obtenir les données que nous avons stockées dans la base de données:

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. Mettre tous ensemble

Enfin, voyons un exemple utilisant chaque section que nous avons couverte dans ce tutoriel:

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

Après avoir exécuté notre exemple, par conséquent, nous pouvons voir dans les journaux que les données ont été correctement stockées dans la base de données:

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

Dans ce didacticiel, nous avons couvert les concepts de base du pilote Java DataStax pour Apache Cassandra. Nous nous sommes connectés à la base de données et avons créé un espace de clés et une table. De plus, nous avons inséré des données dans la table et avons exécuté une requête pour les récupérer.

Comme toujours, le code source de ce didacticiel est disponible à l'adresse over sur Github.