Рубрики
Без рубрики

Проверка сущности, оптимистичная блокировка и согласованность запросов в весенней базе данных Couchbase

Руководство по проверке сущности, оптимистичной блокировке и согласованности запросов с Spring Data Couchbase.

Автор оригинала: baeldung.

1. Введение

После нашего введения в Spring Data Couchbase , в этом втором учебнике мы сосредоточимся на поддержке проверки сущности (JSR-303), оптимистичной блокировки, и различные уровни согласованности запросов для базы данных документов Couchbase.

2. Проверка сущности

Spring Data Couchbase обеспечивает поддержку аннотаций проверки сущности JSR-303. Чтобы воспользоваться этой функцией, сначала мы добавляем библиотеку JSR-303 в раздел зависимостей нашего проекта Maven:


    javax.validation
    validation-api
    1.1.0.Final

Затем добавляем реализацию JSR-303. Мы будем использовать реализацию Hibernate:


    org.hibernate
    hibernate-validator
    5.2.4.Final

Наконец, мы добавляем валидатор завод фасоли и соответствующие Couchbase событие слушателя в нашей конфигурации Couchbase:

@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() {
    return new LocalValidatorFactoryBean();
}

@Bean
public ValidatingCouchbaseEventListener validatingCouchbaseEventListener() {
    return new ValidatingCouchbaseEventListener(localValidatorFactoryBean());
}

Эквивалентная конфигурация XML выглядит так:



Теперь мы добавляем аннотации JSR-303 в наши классы сущностей. Когда нарушение ограничения встречается во время операции на сохранение, операция не удается, бросая ОграничениеВиоляцияЭксцепция .

Вот пример ограничений, которые мы можем обеспечить с участием наших Студенческие Объекты:

@Field
@NotNull
@Size(min=1, max=20)
@Pattern(regexp="^[a-zA-Z .'-]+$")
private String firstName;

...
@Field
@Past
private DateTime dateOfBirth;

3. Оптимистическая блокировка

Spring Data Couchbase не поддерживает многоформатные транзакции, аналогичные тем, которые можно достичь в других модулях Весенних данных, таких как Spring Data JPA (через аннотацию @Transactional ), и не предоставляет функцию отката.

Однако он поддерживает оптимистичную блокировку во многом так же, как и другие модули Весенние данные с помощью @Version аннотация:

@Version
private long version;

Под обложками Couchbase использует так известный как механизм «сравнить и поменять» (CAS) для достижения оптимистичной блокировки на уровне datastore.

Каждый документ в Couchbase имеет связанное значение CAS, которое изменяется автоматически в любое время изменения метаданных или содержимого документа. Использование @Version аннотация на поле приводит к тому, что поле заполняется текущим значением CAS всякий раз, когда документ извлекается из Couchbase.

При попытке сохранить документ обратно в Couchbase это поле проверяется на текущее значение CAS в Couchbase. Если значения не совпадают, операция сохранения не сведется с ОптимистичныйЛокингЭксцепция .

Это чрезвычайно важные отметить, что вы никогда не должны пытаться получить доступ или изменить это поле в коде.

4. Последовательность запросов

При реализации уровня настойчивости над Couchbase, вы должны рассмотреть возможность устаревших читает и пишет. Это связано с тем, что при вставке, обновлении или удалении документов может потребоваться некоторое время, прежде чем будут обновлены представления и индексы поддержки, чтобы отразить эти изменения.

И если у вас есть большой набор данных, поддерживаемый кластером узлов Couchbase, это может стать значительной проблемой, особенно для системы OLTP.

Spring Data обеспечивает надежный уровень согласованности для некоторых операций репозитория и шаблона, а также несколько вариантов, которые позволяют определить уровень чтения и записи согласованности, которая приемлема для вашего приложения.

4.1. Уровни согласованности

Spring Data позволяет указать различные уровни согласованности запросов и устареть для вашего приложения через Последовательность enum найден в org.springframework.data.couchbase.core.query пакет.

Это enum определяет следующие уровни согласованности запросов и устаревшести, от наименее строгого:

  • EVENTUALLY_CONSISTENT
    • устаревшие чтения разрешены
    • индексы обновляются в соответствии со стандартным алгоритмом Couchbase
  • UPDATE_AFTER
    • устаревшие чтения разрешены
    • индексы обновляются после каждого запроса
  • DEFAULT_CONSISTENCY (так же, как READ_YOUR_OWN_WRITES )
  • READ_YOUR_OWN_WRITES
    • устаревшие чтения не допускаются
    • индексы обновляются после каждого запроса
  • STRONGLY_CONSISTENT
    • устаревшие чтения не допускаются
    • индексы обновляются после каждого заявления

4.2. Поведение по умолчанию

Рассмотрим случай, когда у вас есть документы, которые были удалены из Couchbase, и представления и индексы поддержки не были полностью обновлены.

КаучбасРеспозиторий встроенный метод удалитьВсе () безопасно игнорирует документы, которые были найдены в представлении поддержки, но удаление которых еще не отражено представлением.

Аналогичным образом, КаучбасТемплет встроенные методы findByView и findBySpatialView обеспечивают аналогичный уровень согласованности, не возвращая документы, которые первоначально были найдены в представлении поддержки, но которые с тех пор были удалены.

Для всех других методов шаблонов, встроенных методов репозитория и методов запроса производного репозитория, согласно официальной документации Spring Data Couchbase 2.1.x на написания этой статьи, Spring Data использует уровень согласованности по умолчанию Consistency.READ_YOUR_OWN_WRITES.

Стоит отметить, что в более ранних версиях библиотеки использовался дефолт Consistency.UPDATE_AFTER .

Какую бы версию вы ни использовали, если у вас есть какие-либо оговорки о слепом принятии уровня согласованности по умолчанию предоставляется, Весна предлагает два метода, с помощью которых вы можете декларативно контролировать уровень согласованности (ы) используется, как следующие подразделы будут описывать.

4.3. Глобальная настройка согласованности

Если вы используете репозитории Couchbase и ваше приложение требует более высокого уровня согласованности, или если оно может терпеть более слабый уровень, то вы можете переопределить параметр согласованности по умолчанию для всех репозиториев, переопределив getDefaultConsistency () метод в конфигурации Couchbase.

Вот как можно переопределить глобальный уровень согласованности в классе конфигурации Couchbase:

@Override
public Consistency getDefaultConsistency() {
    return Consistency.STRONGLY_CONSISTENT;
}

Вот эквивалентная конфигурация XML:

Обратите внимание, что цена более строгих уровней согласованности увеличивается задержкой во время запроса, поэтому не забудьте адаптировать эту настройку в зависимости от потребностей вашего приложения.

Например, приложение для хранения данных или отчетности, в котором данные часто обновляются или обновляются только в пакете, будет хорошим кандидатом для EVENTUALLY_CONSISTENT , в то время как приложение OLTP, вероятно, следует стремиться к более строгим уровням, таким как READ_YOUR_OWN_WRITES или STRONGLY_CONSISTENT .

4.4. Осуществление пользовательской согласованности

Если вам нужны более тонко настроенные настройки согласованности, вы можете переопределить уровень согласованности по умолчанию на основе запроса за запросом, предоставляя свою собственную реализацию репозитория для любых запросов, уровень согласованности которых вы хотите контролировать самостоятельно и используя запросСмотровая и/или запросN1’L методы, предоставляемые КаучбасТемплет .

Давайте реализуем пользовательский метод репозитория под названием findByFirstNameСтартыС для нашего Студенческие сущность, для которой мы не хотим, чтобы устаревшие чтения.

Во-первых, создайте интерфейс, содержащий пользовательское объявление метода:

public interface CustomStudentRepository {
    List findByFirstNameStartsWith(String s);
}

Далее, реализовать интерфейс, установив Несвежий настройка от базового Couchbase Java SDK до нужного уровня:

public class CustomStudentRepositoryImpl implements CustomStudentRepository {

    @Autowired
    private CouchbaseTemplate template;

    public List findByFirstNameStartsWith(String s) {
        return template.findByView(ViewQuery.from("student", "byFirstName")
          .startKey(s)
          .stale(Stale.FALSE),
          Student.class);
    }
}

Наконец, имея стандартный интерфейс репозитория расширить как общий CrudRepository интерфейс и пользовательский интерфейс репозитория, клиенты будут иметь доступ ко всем встроенным и производным методам стандартного интерфейса репозитория, а также к любым пользовательским методам, которые вы внедрили в вашем пользовательском классе репозитория:

public interface StudentRepository extends CrudRepository,
  CustomStudentRepository {
    ...
}

5. Заключение

В этом учебнике мы показали, как реализовать проверку сущности JSR-303 и достичь оптимистичной возможности блокировки при использовании проекта сообщества Spring Data Couchbase.

Мы также обсудили необходимость понимания согласованности запросов в Couchbase и ввели различные уровни согласованности, предоставляемые Spring Data Couchbase.

Наконец, мы объяснили уровни согласованности по умолчанию, используемые Spring Data Couchbase во всем мире и для нескольких конкретных методов, и мы продемонстрировали способы переопределить глобальную настройку согласованности по умолчанию, а также как переопределить настройки согласованности на основе запроса за запросом, предоставляя свои собственные пользовательские реализации репозитория.

Вы можете просмотреть полный исходный код для этого учебника в проект GitHub .

Чтобы узнать больше о Spring Data Couchbase, посетите официальный Весенние данные Couchbase сайта проекта.