Итак, вот что происходит. Мне очень любопытно увидеть определение таблицы внутри Кассандры. Но учитывая ваш Car
конструктор,
new Car(name, count, type)
Учитывая эти имена столбцов, я предполагаю, что name
является ключом раздела.
Причина, которая является важной, заключается в том, что га sh столбца ключа раздела - это то, что Cassandra использует, чтобы выяснить, в какой узел (диапазон токенов) должны быть записаны данные.
Когда вы saveAll
на 10000 Cars
сразу, нет никак вы можете гарантировать, что все 10000 из них идут на один и тот же узел. Чтобы справиться с этим, Spring Data Cassandra должна использовать BATCH
(или что-то подобное) за кулисами. Если это BATCH
, то это, по сути, ставит один узел Кассандры (обозначенный как «координатор») для маршрутизации записи на требуемые узлы. Из-за распределенной природы Кассандры, , которая никогда не будет быстрой.
Если вам действительно нужно хранить 10000 из них, лучшим способом будет отправить одну запись за раз асинхронно . Конечно, вам не нужно, чтобы все 10000 потоков писали одновременно, поэтому вам нужно уменьшить (ограничить) количество активных потоков в вашем коде. Райан Свихла из DataStax написал пару статей, подробно описывающих, как это сделать. Я рекомендую этот - Cassandra: пакетная загрузка без пакета - Nuanced Edition .
tl; dr;
Spring Data Кассандры saveAll
на самом деле не следует использовать для сохранения нескольких тысяч записей. Если бы я использовал Spring Data Cassandra, я бы не стал даже go за двузначными числами с saveAll
, TBH.
Редактировать
Проверить этот ответ подробности о том, как использовать Spring Boot / Data с Cassandra асинхронно: Примеры AsyncCassandraOperations