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默认值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解Java利用同步块synchronized()保证并发安全
这篇文章主要介绍了Java利用同步块synchronized()保证并发安全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-03-03
java8升级java21方法步骤(完整pom文件升级及代码修改)
在从Java 8升级至Java 211的过程中,需要对多个POM文件进行升级,涉及parent、web、service等模块,文中通过代码介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下2024-11-11
Spring Boot中整合PageHelper实现分页功能详细步骤
在Spring Boot项目中整合PageHelper并实现分页查询功能的全部步骤,通过以上配置和代码,我们可以轻松地实现数据库分页查询,提高了开发效率并改善了用户体验,感兴趣的朋友跟随小编一起看看吧2024-05-05


最新评论