Spring Data «TimeoutException» при вызове удаления документов (с нумерацией страниц) в Couchbase - PullRequest
0 голосов
/ 18 ноября 2018

Наше приложение Spring Boot использует базу данных Couchbase и обращается к ней с помощью Spring-Data

. Чтобы удалить записи из корзины, мы создали следующий метод в хранилище:

Slice<Dog> deleteAllByOwnerIdAndName(String ownerId, String name, Pageable pageable);

У нас также есть соответствующий индекс в корзине:

CREATE INDEX `dogs_by_ownerId_and_name_idx` ON `dogs`(`ownerId`,`name`) WHERE (`_class` = "com.example.Dog")

Наш код использует нумерацию страниц при попытке удалить элементы:

 Slice<Dog> dogsSlice = null;
 Pageable pageable = PageRequest.of(0, 1000, Sort.by("id"));
 int pageCounter = 0;
 do {
   log.debug("Deleting page No. {} of dogs", pageCounter++);
   dogsSlice = dogsRepository.deleteAllByOwnerIdAndName("3243242", "Max", pageable);
 } while (dogsSlice.hasNext());

Но слишком часто мы получаемTimeoutexceptioin:

Удаление страницы № 0 собак

osssTaskUtils $ LoggingErrorHandler: В запланированной задаче произошла непредвиденная ошибка.

org.springframework.data.couchbase.core.CouchbaseQueryExecutionException: Невозможно выполнить запрос из-за следующих ошибок n1ql: {"msg": "Превышено время ожидания 7.5s", "code": 1080} в org.springframework.data.couchbase.core.CouchbaseTemplate.findByN1QL (CouchbaseTemplate).java: 458) ~ [classes! /: 5.1.40] в org.springframework.data.couchbase.repository.query.AbstractN1qlBasedQuery.executeSliced ​​(AbstractN1qlBasedQuery.java:189) ~ [классы! /: 5.1.40] в орг.springframework.data.couchbase.repository.query.AbstractN1qlBasedQuery.executeDependingOnType (AbstractN1qlBasedQuery.java:129) ~ [классы! /: 5.1.40] в org.springframework.data.couchbase.repository.query.AbstractN:q.jjjqqlBQ[classes! /: 5.1.40] в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke (RepositoryFactorySupport.java:590) ~ [классы! /: 5.1.40] в org.springra.repository.core.support.классы! /: 5.1.40] в org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke (DefaultMethodInvokingMethodInterceptor.java:59) ~ [классы! /: 5.1.40] в org.springframework.aop.frameethoho (.ReflectiveMethodInvocation.java:185) ~ [классses! /: 5.1.40] в org.springframework.data.couchbase.repository.support.ViewPostProcessor $ ViewInterceptor.invoke (ViewPostProcessor.java:87) ~ [классы! /: 5.1.40] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:185) ~ [classes! /: 5.1.40] в org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.java:92 [5.1.40]: ​​~)] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:185) ~ [классы! /: 5.1.40] в org.springframework.aop.interceptor.ExposeInvocationInterceptor.orv ()[classes! /: 5.1.40] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:185) ~ [классы! /: 5.1.40] в org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke (SurroundingTransactionDetectorMethodInterceptor.java:61) ~ [classes! /: 5.1.40] в org.springframework.aop.framework.: 5.1.40] at com.sun.proxy. $ Proxy130.deleteAllByOwnerIdAndName (неизвестный источник) ~ [na: na]

Что еще нам нужно сделать?

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Sort.by("id") вызывает задержку в запросе, так как кажется, что Couchbase сортирует всю коллекцию документов по этим критериям.

Так что если нет реальной необходимости сортировать результаты, толучше использовать

Pageable pageable = PageRequest.of(0, 1000);

0 голосов
/ 27 декабря 2018

Если в запросе есть ORDER BY, по возможности оптимизатор попытается использовать порядок индексов.Если это невозможно, он должен собрать все возможные наборы данных и отсортировать данные для удовлетворения запроса, даже если нумерация страниц требует нескольких элементов.

Проверьте правило № 7 https://blog.couchbase.com/create-right-index-get-right-performance/

Также см. Эту статью https://blog.couchbase.com/offset-keyset-pagination-n1ql-query-couchbase/

0 голосов
/ 19 ноября 2018

Вы можете улучшить несколько вещей:

1) Измените свой индекс для сортировки по ownerId, затем при удалении сортируйте также по ownerId

CREATE INDEX `dogs_by_ownerId_and_name_idx` ON `dogs`(`ownerId` ASC,`name`) WHERE (`_class` = "com.example.Dog") 

Поскольку ваш индекс уже отсортирован, couchbase не будет тратить дополнительное время на его сортировку во время удаления.

2) Вам действительно нужно вернуть все удаленные объекты? Couchbase должен принести все атрибуты, которых нет в вашем индексе, перед отправкой документов обратно вам, и эта операция займет некоторое дополнительное время. Лучший подход - вернуть только идентификаторы.

@Override
public void updateFamilyName(String familyName, String familyId) {

    String queryString = "Delete from "+getBucketName()+" WHERE "+getClassFilter()+" " +
            " and familyId = '"+familyId+"' RETURNING meta().id";

    N1qlParams params = N1qlParams.build().consistency(ScanConsistency.REQUEST_PLUS).adhoc(true);
    ParameterizedN1qlQuery query = N1qlQuery.parameterized(queryString, JsonObject.create(), params);
    checklistRepository.getCouchbaseOperations().getCouchbaseBucket().query(query);
}

private String getBucketName(){
    return checklistRepository.getCouchbaseOperations().getCouchbaseBucket().bucketManager().info().name();
}

private String getClassFilter(){
    return "_class = '" + Checklist.class.getName() + "' ";
}

3) Вы также можете улучшить свою нумерацию страниц, но я не думаю, что это будет необходимо в вашем случае.

https://blog.couchbase.com/offset-keyset-pagination-n1ql-query-couchbase/

...