hibernate缓存相关问题排查

*文中表和字段均为虚构

一、问题现象描述

1、某次需求中,给tb_student表增加字段nick_name(NOT NULL DEFAULT ‘’),并且只有在这条链路才会写nick_name:
INSERT INTO tb_student (name,nick_name,gender,status) VALUES (‘jack’,‘jjjjack’,1,1);
之前原有链路(后文称链路2)均为
INSERT INTO tb_student (name,gender,status) VALUES (‘ming’,1,1);

id name nick_name gender status
1 jack jjjjack 1 1
3 ming 1 1

2、测试无问题,线上观察无问题
3、同事在做其他需求时,跑单测时,发现链路2必现报错(详细异常堆栈省略):

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
......
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'nick_name' cannot be null
......

但是如果启动服务,直接请求http接口,则无问题
4、某天线上也出现类似报错,但是之前一礼拜包括之后一礼拜再未出现报错(能查到日志)。

因此以上可以总结为两个问题:

  • 问题1:http调用和单测现象不一致
  • 问题2:线上偶发报错

二、问题排查

就这个诡异的现象,让排查无从下手。

1、异常定位

首先定位异常发生代码,发现流程为:
1、生成student数据,初始状态为1,插入tb_student表
2、事务中更新tb_course表、tb_teacher表。
3、更新步骤1中student状态为2,并update到tb_student表。上述异常,就是发生在这一步

    public void deal() {
   
        Student student = Student.builder()
                .name("ming")
                .gender(1)
                .status(1)
                .build();
        studentRepo.save(student);
        studentRepo.flush();

        try {
   

            transactionTemplate.execute(t -> {
   
                QCourse qCourse = QCourse.course;
                jpaQueryFactory.update(qCourse);

                QTeacher qTeacher = QTeacher.teacher;
                jpaQueryFactory.update(qTeacher);
                return t;
            });
        } catch (Exception e) {
   

        } finally {
   
            student.setStatus(2);
            studentRepo.save(student);
            studentRepo.flush();
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate、MyBatis和Spring Data JPA都是Java持久化框架,但它们各自有不同的优缺点。 Hibernate是一个全自动ORM框架,它可以将Java对象映射到数据库表中。Hibernate具有以下优点: - 简化了数据库操作,使开发变得更加容易和快捷。 - Hibernate具有强大的缓存机制,可以提高应用程序的性能。 - 支持延迟加载和预取,可以优化查询性能。 - Hibernate提供了丰富的映射关系和查询功能,可以满足复杂业务场景的需求。 但是,Hibernate也存在一些缺点: - Hibernate自动生成的SQL语句可能不够优化,导致性能问题。 - Hibernate的学习曲线比较陡峭,需要掌握复杂的映射关系和查询语言。 - Hibernate的配置比较复杂,需要花费一定的时间和精力。 MyBatis是一个半自动化ORM框架,它将SQL语句与Java代码分离。MyBatis具有以下优点: - MyBatis使用简单,易于学习和使用。 - MyBatis具有良好的灵活性,可以自由控制SQL语句的生成。 - MyBatis支持较好的批量处理和动态SQL,可以提高性能。 但是,MyBatis也存在一些缺点: - MyBatis需要手写SQL语句,对于复杂的查询可能会比较麻烦。 - MyBatis对于多表关联的查询支持相对较弱,需要手动编写复杂的SQL语句。 - MyBatis的错误提示不够友好,需要花费一定的时间和精力进行排查。 Spring Data JPA是Spring Data家族中的一个成员,它是一个全自动化ORM框架,使用JPA规范。Spring Data JPA具有以下优点: - Spring Data JPA提供了大量的自动化特性,可以大幅度减少开发时间。 - Spring Data JPA支持多种数据库,可以灵活地切换数据库。 - Spring Data JPA提供了良好的错误提示和调试信息,方便排查问题。 但是,Spring Data JPA也存在一些缺点: - Spring Data JPA对于复杂查询的支持相对较弱,需要手写SQL语句。 - Spring Data JPA的性能可能存在一定的问题,需要合理配置和优化。 - Spring Data JPA依赖于JPA规范,可能对于一些特殊需求不太适用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值