1. Обзор
Дистрибутив DataStax Apache Cassandra-это готовая к производству распределенная база данных, совместимая с открытым исходным кодом Cassandra. Он добавляет несколько функций, которые недоступны в дистрибутиве с открытым исходным кодом, включая мониторинг, улучшенную пакетную и потоковую обработку данных.
DataStax также предоставляет Java-клиент для распространения Apache Cassandra. Этот драйвер легко настраивается и может использовать все дополнительные функции в дистрибутиве DataStax, но он также полностью совместим с версией с открытым исходным кодом.
В этом уроке мы увидим, как использовать Java-драйвер DataStax для Apache Cassandra | для подключения к базе данных Cassandra и выполнения основных манипуляций с данными.
2. Зависимость Maven
Чтобы использовать драйвер Java DataStax для Apache Cassandra, нам нужно включить его в наш путь к классам.
С Maven нам просто нужно добавить java-драйвер-ядро зависимость к вашему pom.xml :
com.datastax.oss java-driver-core 4.1.0 com.datastax.oss java-driver-query-builder 4.1.0
3. Использование драйвера DataStax
Теперь, когда у нас есть водитель, давайте посмотрим, что мы можем с ним сделать.
3.1. Подключение к базе данных
Чтобы подключиться к базе данных, мы создадим сеанс Cql :
CqlSession session = CqlSession.builder().build();
Если мы явно не определим какую-либо точку контакта, конструктор по умолчанию будет иметь значение 127.0.0.1:9042 .
Давайте создадим класс соединителя с некоторыми настраиваемыми параметрами для построения сеанса Cql :
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. Создание пространства ключей
Теперь, когда у нас есть подключение к базе данных, нам нужно создать наше пространство ключей. Давайте начнем с написания простого класса репозитория для работы с нашим пространством ключей.
Для этого урока мы будем использовать Простую стратегию стратегию репликации с количеством реплик, равным 1 :
public class KeyspaceRepository {
public void createKeyspace(String keyspaceName, int numberOfReplicas) {
CreateKeyspace createKeyspace = SchemaBuilder.createKeyspace(keyspaceName)
.ifNotExists()
.withSimpleStrategy(numberOfReplicas);
session.execute(createKeyspace.build());
}
// ...
}Кроме того, мы можем начать использовать пространство клавиш в текущем сеансе :
public class KeyspaceRepository {
//...
public void useKeyspace(String keyspace) {
session.execute("USE " + CqlIdentifier.fromCql(keyspace));
}
}3.3. Создание таблицы
Драйвер предоставляет инструкции для настройки и выполнения запросов в базе данных. Например, мы можем задать пространство клавиш для использования индивидуально в каждом операторе .
Мы определим модель Video и создадим таблицу для ее представления:
public class Video {
private UUID id;
private String title;
private Instant creationDate;
// standard getters and setters
}Давайте создадим нашу таблицу, имея возможность определить пространство ключей, в котором мы хотим выполнить запрос. Мы напишем простой Репозиторий видео класс для работы с нашими видеоданными:
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);
}
// ...
}Обратите внимание, что мы перегружаем метод CreateTable .
Идея перегрузки этого метода заключается в том, чтобы иметь два варианта создания таблицы:
- Создайте таблицу в определенном пространстве ключей, отправив имя пространства ключей в качестве параметра, независимо от того, какое пространство ключей в данный момент использует сеанс
- Начните использовать пространство ключей в сеансе и используйте метод создания таблицы без каких — либо параметров-в этом случае таблица будет создана в пространстве ключей, которое в данный момент использует сеанс
3.4. Вставка Данных
Кроме того, драйвер предоставляет подготовленные и ограниченные заявления.
То Подготовленное Заявление обычно используется для запросов, выполняемых часто, с изменениями только в значениях.
Мы можем заполнить Подготовленное заявление нужными нам значениями. После этого мы создадим BoundStatement и выполним его.
Давайте напишем метод для вставки некоторых данных в базу данных:
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. Данные запроса
Теперь давайте добавим метод, который создает простой запрос для получения данных, которые мы сохранили в базе данных:
public class VideoRepository {
// ...
public List3.6. Собрать Все Это Воедино
Наконец, давайте рассмотрим пример использования каждого раздела, который мы рассмотрели в этом руководстве:
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();
}
} После выполнения нашего примера в результате мы можем видеть в журналах, что данные были правильно сохранены в базе данных:
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. Заключение
В этом уроке мы рассмотрели основные концепции драйвера Java DataStax для Apache Cassandra. Мы подключились к базе данных и создали пространство ключей и таблицу. Кроме того, мы вставили данные в таблицу и выполнили запрос, чтобы получить их.
Как всегда, исходный код этого учебника доступен на Github .