簡體   English   中英

saveAll() 太慢了。 使用 Spring 啟動的 Cassandra 數據庫。 為什么?

[英]saveAll() is too slow. Cassandra Database with Spring boot. why?

我正在嘗試批量插入(對象存儲在數組列表中,一旦計數可被 10000 整除,我將所有這些對象插入到我的表中。但這樣做需要 4 多分鍾。有沒有什么方法可以快點?

arr.add(new Car(name, count, type));
if(count%10000==0){
repository.saveAll(arr);
arr.clear();
}

所以這就是正在發生的事情。 我最想看到 Cassandra 中的表定義。 但考慮到你的Car構造函數,

new Car(name, count, type)

鑒於這些列名稱,我猜測該name是分區鍵。

之所以重要,是因為分區鍵列的哈希值是 Cassandra 用來確定數據應該寫入哪個節點(令牌范圍)的東西。

saveAll在10000輛Cars一次,有沒有辦法可以保證這些所有的10000是要在同一個節點。 為了解決這個問題,Spring Data Cassandra 必須在幕后使用BATCH (或類似的東西)。 如果它是一個BATCH ,那基本上就是讓一個 Cassandra 節點(指定為“協調器”)將寫入路由到所需的節點。 由於 Cassandra 的分布式特性,這永遠不會很快。

如果您真的需要存儲 10000 個,最好的方法是異步發送一次寫入。 當然,您不希望 10000 個線程全部同時寫入,因此您需要節流(限制)代碼中的活動線程數。 DataStax 的 Ryan Svihla 寫了幾篇文章詳細介紹了如何做到這一點。 我推薦這個 - Cassandra: Batch Loading without the Batch - The Nuanced Edition

tl;博士;

Spring Data Cassandra 的saveAll真的不應該用於持久化數千次寫入。 如果我使用 Spring Data Cassandra,我什至不會使用saveAll和 TBH 超過兩位數。

編輯

查看此答案以了解有關如何將 Spring Boot/Data 與 Cassandra 異步使用的詳細信息: AsyncCassandraOperations 示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM