Spring Data默认值的错误

简介: Spring Data有很多配置的默认值,但不一定都适合你。如一个依赖Cassandra 的项目,有时写入数据后,并不能立马读到。这种错误并没有什么报错,一切都是正常的,就是读不到数据。

Spring Data有很多配置的默认值,但不一定都适合你。如一个依赖Cassandra 的项目,有时写入数据后,并不能立马读到。这种错误并没有什么报错,一切都是正常的,就是读不到数据。


1 源码解析

直接使用 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

1

很多默认配置,很重要配置是 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。运行时配置调试截图:

14.png

Cassandra 使用核心原则:使R(读)+W(写)>N,即读和写的节点数之和大于备份数。


设数据备份 3 份,待写入数据分别存储在 A、B、C 节点。常见搭配是 R(读)和 W(写)的一致性都是 LOCAL_QURAM,这样可以保证能及时读到写入的数据;而假设在这种情况下,读写都用 LOCAL_ONE,则可能发生这样的情况:用户写入一个节点 A 就返回,但用户 B 立马读的节点是 C,由于是LOCAL_ONE 一致性,则读完 C 就可立马返回。此时,就会出现数据读取可能落空case。

13.png


为何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,符合实际产品部署和应用情况。

目录
相关文章
|
30天前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
34 9
|
2月前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
3月前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
41 0
|
4月前
|
NoSQL Java API
Spring Data MongoDB 使用
Spring Data MongoDB 使用
214 1
|
3月前
|
存储 Java 数据库
|
3月前
|
存储 Java API
|
3月前
|
Java 数据库连接 数据库
Spring Data JPA 与 Hibernate 之区别
【8月更文挑战第21天】
73 0
|
5月前
|
安全 Java API
Java一分钟之-Spring Data REST:创建RESTful服务
【6月更文挑战第15天】Spring Data REST让基于Spring Data的项目轻松创建REST API,免去大量控制器代码。通过自动HTTP映射和链接生成,简化CRUD操作。文章涵盖启用REST、配置仓库、自定义端点、解决过度暴露、缺失逻辑和安全性问题,提供代码示例,如自定义Repository、投影和安全配置,强调在利用其便利性时注意潜在挑战。
73 5
|
4月前
|
存储 Java 关系型数据库
Spring Data与多数据源配置
Spring Data与多数据源配置
|
4月前
|
存储 监控 Java
Spring Cloud Data Flow的实时数据处理
Spring Cloud Data Flow的实时数据处理