Introdução ao driver Java DataStax para Apache Cassandra
1. Visão geral
O DataStax Distribution deApache Cassandra é um banco de dados distribuído pronto para produção, compatível com o Cassandra de código aberto. Ele adiciona alguns recursos que não estão disponíveis na distribuição de código aberto, incluindo monitoramento, lote aprimorado e processamento de dados de streaming.
O DataStax também fornece um cliente Java para sua distribuição do Apache Cassandra. Este driver é altamente ajustável e pode tirar proveito de todos os recursos extras na distribuição DataStax, mas também é totalmente compatível com a versão de código aberto.
Neste tutorial, veremoshow to use the DataStax Java Driver for Apache Cassandra para se conectar a um banco de dados Cassandra e realizar a manipulação de dados básicos.
2. Dependência do Maven
Para usar o Driver Java DataStax para Apache Cassandra, precisamos incluí-lo em nosso caminho de classe.
Com o Maven, simplesmente temos que adicionarjava-driver-core dependency ao nossopom.xml:
com.datastax.oss
java-driver-core
4.1.0
com.datastax.oss
java-driver-query-builder
4.1.0
3. Usando o driver DataStax
Agora que instalamos o driver, vamos ver o que podemos fazer com ele.
3.1. Conecte-se ao banco de dados
Para se conectar ao banco de dados, criaremos umCqlSession:
CqlSession session = CqlSession.builder().build();
Se não definirmos explicitamente nenhum ponto de contato, o construtor assumirá como padrão127.0.0.1:9042.
Vamos criar uma classe de conector, com alguns parâmetros configuráveis, para construir oCqlSession:
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. Criar espaço de chaves
Agora que temos uma conexão com o banco de dados, precisamos criar nosso espaço de chaves. Vamos começar escrevendo uma classe de repositório simples para trabalhar com nosso keyspace.
Para este tutorial,we’ll use the SimpleStrategy replication strategy with the number of replicas set to 1:
public class KeyspaceRepository {
public void createKeyspace(String keyspaceName, int numberOfReplicas) {
CreateKeyspace createKeyspace = SchemaBuilder.createKeyspace(keyspaceName)
.ifNotExists()
.withSimpleStrategy(numberOfReplicas);
session.execute(createKeyspace.build());
}
// ...
}
Além disso, podemosstart using the keyspace in the current session:
public class KeyspaceRepository {
//...
public void useKeyspace(String keyspace) {
session.execute("USE " + CqlIdentifier.fromCql(keyspace));
}
}
3.3. Criar a tabela
O driver fornece instruções para configurar e executar consultas no banco de dados. Por exemplo,we can set the keyspace to use individually in each statement.
Vamos definir o modeloVideo e criar uma tabela para representá-lo:
public class Video {
private UUID id;
private String title;
private Instant creationDate;
// standard getters and setters
}
Vamos criar nossa tabela, tendo a possibilidade de definir o keyspace no qual queremos realizar a consulta. Vamos escrever uma classeVideoRepository simples para trabalhar com nossos dados de vídeo:
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);
}
// ...
}
Observe que estamos sobrecarregando o métodocreateTable.
A idéia por trás da sobrecarga desse método é ter duas opções para a criação da tabela:
-
Crie a tabela em um espaço de chave específico, enviando o nome do espaço de chaves como o parâmetro, independentemente de qual espaço de chaves é a sessão atualmente usando
-
Comece a usar um espaço de chave na sessão e use o método para a criação da tabela sem nenhum parâmetro - nesse caso, a tabela será criada no espaço de chave que a sessão está usando no momento
3.4. Inserir dados
Além disso, o driver fornece instruções preparadas e limitadas.
OPreparedStatement é normalmente usado para consultas executadas com frequência, com alterações apenas nos valores.
Podemos preencherPreparedStatement com os valores de que precisamos. Depois disso, vamos criar umBoundStatemente executá-lo.
Vamos escrever um método para inserir alguns dados no banco de dados:
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. Dados da consulta
Agora, vamos adicionar um método que cria uma consulta simples para obter os dados que armazenamos no banco de dados:
public class VideoRepository {
// ...
public List
3.6. Juntando tudo
Finalmente, vamos ver um exemplo usando cada seção que abordamos neste 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();
}
}
Depois de executarmos o nosso exemplo, como resultado, podemos ver nos logs que os dados foram armazenados corretamente no banco de dados:
INFO com.example.datastax.cassandra.Application - [id:733249eb-914c-4153-8698-4f58992c4ad4, title:Video Title 1, creationDate: 2019-07-10T19:43:35.112Z]
INFO com.example.datastax.cassandra.Application - [id:a6568236-77d7-42f2-a35a-b4c79afabccf, title:Video Title 2, creationDate: 2019-07-09T19:43:35.181Z]
4. Conclusão
Neste tutorial, abordamos os conceitos básicos do Driver DataStax Java para Apache Cassandra. Nós nos conectamos ao banco de dados e criamos um espaço de chaves e uma tabela. Além disso, inserimos dados na tabela e executamos uma consulta para recuperá-los.
Como sempre, o código-fonte deste tutorial está disponívelover on Github.