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 List
3.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))); Listvideos = 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 .