Spring Data默認值的錯誤解決
Spring Data有很多配置的默認值,但不一定都適合你。如一個依賴Cassandra 的項目,有時寫入數據後,並不能立馬讀到。這種錯誤並沒有什麼報錯,一切都是正常的,就是讀不到數據。
源碼解析
直接使用 Spring Data Cassandra 操作時,實際依賴 Cassandra driver 內部的配置文件,目錄:
.m2\repository\com\datastax\oss\java-driver-core\4.6.1\java-driver-core-4.6.1.jar!\reference.conf
很多默認配置,很重要配置是 Consistency,driver中默認為 LOCAL_ONE:
basic.request { # The consistency level. # # Required: yes # Modifiable at runtime: yes, the new value will be used for requests issued after the change. # Overridable in a profile: yes consistency = LOCAL_ONE //省略其他非關鍵配置 }
執行讀寫操作時,都會使用 LOCAL_ONE。運行時配置調試截圖:
Cassandra 使用核心原則:使R(讀)+W(寫)>N
,即讀和寫的節點數之和大於備份數。
設數據備份 3 份,待寫入數據分別存儲在 A、B、C 節點。常見搭配是 R(讀)和 W(寫)的一致性都是 LOCAL_QURAM,這樣可以保證能及時讀到寫入的數據;而假設在這種情況下,讀寫都用 LOCAL_ONE,則可能發生這樣的情況:用戶寫入一個節點 A 就返回,但用戶 B 立馬讀的節點是 C,由於是LOCAL_ONE 一致性,則讀完 C 就可立馬返回。此時,就會出現數據讀取可能落空case。
為何Cassandra driver 默認使用 LOCAL_ONE?其實是最合適的,因為隻有一臺機器,讀寫都隻能命中一臺。但產線上的 Cassandra 大多都是多數據中心多節點的,備份數大於1。所以讀寫都用 LOCAL_ONE 就會出現問題。
修正
修改默認值,以 consistency 為例。
@Override protected SessionBuilderConfigurer getSessionBuilderConfigurer() { return cqlSessionBuilder -> { DefaultProgrammaticDriverConfigLoaderBuilder defaultProgrammaticDriverConfigLoaderBuilder = new DefaultProgrammaticDriverConfigLoaderBuilder(); driverConfigLoaderBuilderCustomizer().customize(defaultProgrammaticDriverConfigLoaderBuilder); cqlSessionBuilder.withConfigLoader(defaultProgrammaticDriverConfigLoaderBuilder.build()); return cqlSessionBuilder; }; } @Bean public DriverConfigLoaderBuilderCustomizer driverConfigLoaderBuilderCustomizer() { return loaderBuilder -> loaderBuilder .withString(REQUEST_CONSISTENCY, ConsistencyLevel.LOCAL_QUORUM.name()) }
將一致性級別從 LOCAL_ONE 改成瞭 LOCAL_QUARM,符合實際產品部署和應用情況。
到此這篇關於Spring Data默認值的錯誤解決的文章就介紹到這瞭,更多相關Spring Data默認值內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 關於Python連接Cassandra容器進行查詢的問題
- 使用Stargate訪問K8ssandra的過程之Springboot整合Cassandra
- 優化spring boot應用後6s內啟動內存減半
- 使用Spring Data R2DBC +Postgres實現增刪改查功能
- 關於Spring Data Jpa 自定義方法實現問題