Spring Data默认值的错误解决

 更新时间:2023年01月17日 16:08:14   作者:JavaEdge.  
本文主要介绍了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默认值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解DES加密算法及在Java程序中的使用示例

    详解DES加密算法及在Java程序中的使用示例

    这篇文章主要介绍了详解DES加密算法及在Java程序中的使用示例,文中还有一个用Java实现的DES三重加密的例子,需要的朋友可以参考下
    2016-04-04
  • 详解Java利用同步块synchronized()保证并发安全

    详解Java利用同步块synchronized()保证并发安全

    这篇文章主要介绍了Java利用同步块synchronized()保证并发安全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • java使用RabbitMQ实现延迟消息示例

    java使用RabbitMQ实现延迟消息示例

    本文介绍了在分布式系统中,使用RabbitMQ实现延迟消息处理,其中详细阐述了RabbitMQ队列和交换机的配置、消息的发送与接收以及死信队列的处理,具有一定的参考价值,感兴趣的可以了解一下
    2024-10-10
  • java8升级java21方法步骤(完整pom文件升级及代码修改)

    java8升级java21方法步骤(完整pom文件升级及代码修改)

    在从Java 8升级至Java 211的过程中,需要对多个POM文件进行升级,涉及parent、web、service等模块,文中通过代码介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-11-11
  • Netty分布式pipeline管道传播事件的逻辑总结分析

    Netty分布式pipeline管道传播事件的逻辑总结分析

    这篇文章主要为大家介绍了Netty分布式pipeline管道传播事件总结分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java常用数字工具类 大数乘法、加法、减法运算(2)

    Java常用数字工具类 大数乘法、加法、减法运算(2)

    这篇文章主要为大家详细介绍了Java常用数字工具类,大数乘法、加法、减法运算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Spring Boot实现JWT token自动续期的实现

    Spring Boot实现JWT token自动续期的实现

    本文主要介绍了Spring Boot实现JWT token自动续期,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 一篇文章超详细的介绍Java继承

    一篇文章超详细的介绍Java继承

    Java中的继承是一种机制,表示为一个对象获取父对象的所有属性和行为,下面这篇文章主要给大家介绍了关于Java继承的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Spring Boot中整合PageHelper实现分页功能详细步骤

    Spring Boot中整合PageHelper实现分页功能详细步骤

    在Spring Boot项目中整合PageHelper并实现分页查询功能的全部步骤,通过以上配置和代码,我们可以轻松地实现数据库分页查询,提高了开发效率并改善了用户体验,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Java如何获取客户端mac地址

    Java如何获取客户端mac地址

    在用户登录时,通过获取IP地址来识别计算机的MAC地址,然后将用户账号与该MAC地址进行绑定,确保每个账号只能在一台特定的计算机上登录,增强系统安全性,这种方法适用于需要严格账户安全管理的场景
    2024-09-09

最新评论