Статьи

Начало работы с Apache Cassandra и Java (часть II)

Требования

Чтобы следовать этому руководству, у вас уже должен быть запущенный экземпляр Cassandra ( небольшой кластер был бы хорош , но не обязателен), драйвер Java Datastax установлен ( см. Часть I ) и прошел 10-минутное пошаговое руководство здесь: http : //planetcassandra.org/create-a-keyspace-and-table/ .

Попробуйте это

Для этой демонстрации мы собираемся создать простое консольное приложение, почти идентичное тому, которое было в части I, только на этот раз мы будем изучать политики подключения, подготовленные операторы и построитель запросов. Откройте текстовый редактор и создайте файл Java с классом «GettingStartedTwo» и единственным основным методом.

1
2
3
4
5
6
7
8
public class GettingStartedTwo {
  
public static void main(String[] args) {
  
        Cluster cluster;
        Session session;
        ResultSet results;
        Row rows;

Затем мы можем подключиться к нашему кластеру и создать экземпляр сеанса.

1
2
3
4
5
// Connect to the cluster and keyspace "demo"
Cluster cluster = Cluster.builder()
                  .addContactPoint("localhost")
                  .build();
Session session = cluster.connect("demo");

Но подождите, теперь, когда мы запускаем кластер вместо одного экземпляра, мы хотим применить некоторые меры безопасности в случае сбоя. Мы можем сделать это с помощью RetryPolicy. Политика повторных попыток определяет поведение по умолчанию, которое следует принять, когда запрос истекает или когда узел недоступен. В этом случае мы используем DefaultRetryPolicy, который будет повторять запросы либо:

  • на тайм-аут чтения, когда достаточно реплик ответили, но данные не были получены.
  • на тайм-аут записи, если мы тайм-аут во время записи журнала, используемого пакетными операторами.
1
2
3
4
5
6
cluster = Cluster
    .builder()
    .addContactPoint("192.168.0.30")
    .withRetryPolicy(DefaultRetryPolicy.INSTANCE)
    .build();
session = cluster.connect("demo");

Политика балансировки нагрузки будет определять, на каком узле будет выполняться запрос. Поскольку клиент может читать или писать на любом узле, иногда это может быть неэффективно. Если узел получает доступ для чтения или записи, принадлежащий другому узлу, он будет координировать этот запрос для клиента. Мы можем использовать политику балансировки нагрузки для управления этим действием. TokenAwarePolicy гарантирует, что запрос пойдет к узлу или реплике, ответственным за данные, указанные первичным ключом. Он обернут вокруг DCAwareRoundRobinPolicy, чтобы запросы оставались в локальном центре данных. Это хороший выбор для нас, так как, хотя у нас есть только один локальный кластер на данный момент, мы уже думаем о следующем шаге, расширяющемся до мультицентра.

1
2
3
4
5
6
7
8
cluster = Cluster
        .builder()
        .addContactPoint("192.168.0.30")
        .withRetryPolicy(DefaultRetryPolicy.INSTANCE)
        .withLoadBalancingPolicy(
                         new TokenAwarePolicy(new DCAwareRoundRobinPolicy()))
        .build();
session = cluster.connect("demo");

Теперь, когда вы подключились к пространству клавиш «demo», давайте вставим пользователя в таблицу «users». Это именно то, что мы делали в первой части ранее, но на этот раз мы делаем это немного иначе. Использование подготовленного заявления является более безопасным и наиболее эффективным способом получения данных в нашу базу данных или из нее. Подготовленные операторы должны анализироваться кластером только один раз, а затем значения привязываются к переменным, а затем мы выполняем связанный оператор для чтения / записи данных из кластера.

01
02
03
04
05
06
07
08
09
10
// Insert one record into the users table
        PreparedStatement statement = session.prepare(
  
        "INSERT INTO users" + "(lastname, age, city, email, firstname)"
                + "VALUES (?,?,?,?,?);");
  
        BoundStatement boundStatement = new BoundStatement(statement);
  
        session.execute(boundStatement.bind("Jones", 35, "Austin",
                "[email protected]", "Bob"));

Используя драйвер Java, мы можем легко вытащить пользователя обратно. В первой части «Начало работы с Apache Cassandra с Java» мы использовали строковое представление CQL. Теперь (и для остальной части учебника) мы собираемся сделать то же самое с Query Builder, который является более безопасным и избавляет нас от потенциальных атак инъекцией CQL.

1
2
3
4
5
6
7
8
// Use select to get the user we just entered
        Statement select = QueryBuilder.select().all().from("demo", "users")
                .where(eq("lastname", "Jones"));
        results = session.execute(select);
        for (Row row : results) {
            System.out.format("%s %d \n", row.getString("firstname"),
                    row.getInt("age"));
        }

Поскольку у Боба день рождения, мы собираемся обновить его возраст.

01
02
03
04
05
06
07
08
09
10
11
12
// Update the same user with a new age
        Statement update = QueryBuilder.update("demo", "users")
                .with(QueryBuilder.set("age", 36))
                .where((QueryBuilder.eq("lastname", "Jones")));
                        session.execute(update);
// Select and show the change
        select = QueryBuilder.select().all().from("demo", "users")
                .where(eq("lastname", "Jones"));
        results = session.execute(select);
        for (Row row : results) {
            System.out.format("%s %d \n", row.getString("firstname"),
                    row.getInt("age"));

Теперь давайте удалим Боба из таблицы и распечатаем всю информацию, оставшуюся в таблице пользователей. Вы заметите, что информация Боба больше не возвращается после удаления (другие могут, если вы ранее добавили пользователей).

01
02
03
04
05
06
07
08
09
10
11
12
// Delete the user from the users table
           Statement delete = QueryBuilder.delete().from("users")
                .where(QueryBuilder.eq("lastname", "Jones"));
        results = session.execute(delete);
        // Show that the user is gone
           select = QueryBuilder.select().all().from("demo", "users");
        results = session.execute(select);
        for (Row row : results) {
            System.out.format("%s %d %s %s %s\n", row.getString("lastname"),
                    row.getInt("age"), row.getString("city"),
                    row.getString("email"), row.getString("firstname"));
        }

Убедитесь, что соединение закрывается, как только вы закончите.

1
2
3
4
// Clean up the connection by closing it
cluster.close();
    }
}

CQL очень похож на SQL, во многих случаях будет работать тот же синтаксис. Это делает запрос данных очень простым, если у вас есть фон с реляционными базами данных. Вам только что удалось подключиться к кластеру Cassandra и выполнить запросы к действующей (локальной) базе данных. Надеюсь, это демонстрирует, насколько просто использовать Cassandra с помощью драйвера Java. Суть полного консольного приложения для этого образца доступна на GitHub .

Ссылка: Начало работы с Apache Cassandra и Java (часть II) от нашего партнера по JCG Ребекки Миллс в блоге Planet Cassandra .