Является ли хорошей идеей использовать datastax mapper для сохранения тысяч записей с помощью saveAsync - PullRequest
0 голосов
/ 09 января 2019

Мне нужно сохранить тысячи записей за минимально возможное время и надежным способом. Поскольку я новичок в драйвере datastax, я не знаю лучшего способа выполнения BULK-записей на Cassandra

Все записи принадлежат одному паратиону (без учета репликации здесь) Количество записей может варьироваться от 250 до 25000

public void save(List<CassandraResource> listOfCassandraResource) 
{
    Mapper<CassandraResource> mapper = this.mappingManager.mapper(CassandraResource.class, this.keyspace);
    mapper.setDefaultSaveOptions(Option.saveNullFields(false));
    for (CassandraResource resource: listOfCassandraResource)
    {
        ListenableFuture<Void> future = mapper.saveAsync(resource);
    }
}

1 Ответ

0 голосов
/ 09 января 2019

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

Это может быть сделано при настройке объекта Cluster или во время выполнения:

PoolingOptions poolingOptions = new PoolingOptions();
poolingOptions.setMaxRequestsPerConnection(HostDistance.LOCAL, 32768);
Cluster cluster = Cluster.builder().withContactPoints("...")
     .withPoolingOptions(poolingOptions).build();

Подробнее см. документация для водителя .

Если у вас гораздо больше данных, вам может понадобиться использовать какой-то семафор и т. Д., Чтобы предотвратить отправку слишком большого количества запросов. Вы можете увидеть один из примеров здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...