Spring Boot JPA save之怪异

Spring Boot JPA save方法之怪异

项目场景

工作中的一个小需求,由于这个项目第一阶段只是引入,作为触发程序在后台跑数据,将下游的数据引入即可。所以不需要暴露在页面上。所以报错的话,是没有任何人感知的。所以需要提供一个监控程序,就是在遇到异常就记录下来,每日满足发生5次异常就发送邮件通知,通知后就不再通知。


问题描述

程序其实很简单,但是测试Demo的时候,由于使用的是JPA,使用的save方法保存,方法内部处理就是先判断isNew,然后去做update或者insert操作。问题是这个方法遇到数据库异常,比如主键冲突,虽然打印日志,但是异常实际上是被某个异常处理器处理掉了,根本报不出来。

java 复制代码
try{
    dao.save(entity);
}catch (Exception e) {
    log.error("error happened", e);
    monitorExceptionService.recordError(e);
}

这个错误日志是进入不到catch里面的。


问题原因

网上资料介绍要使用saveAndFlush方法,查看内部源码,其实就是多了一个flush方法。flush其实就是将sql预编译执行的结果发送给数据库得到的结果。save方法是在sql统一提交的才会报错,就是@Transactional整体结束的时候报错,所以catch不到报错。而saveAndFlush方法多的flush方法就是将sql结果发送到数据库,所以立马能得到报错。

源码如下:

java 复制代码
	@Transactional
	@Override
	public <S extends T> S saveAndFlush(S entity) {

		S result = save(entity);
		flush();

		return result;
	}

解决方案

就是将save方法改为saveAndFlush方法即可。

代码如下:

java 复制代码
try{
    dao.saveAndFlush(entity);
}catch (Exception e) {
    log.error("error happened", e);
    monitorExceptionService.recordError(e);
}

搞定收工!

相关推荐
码农进化录1 小时前
Java 程序员的 AI 进化论 | LangChain4j 入门,Java 开发者的 AI 应用框架
java·spring boot·openai
Boop_wu5 小时前
SpringBoot 集成阿里云短信认证服务(个人)
spring boot·后端·阿里云
小蒜学长6 小时前
“守望自然”招募志愿者环保行动网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
weixin_BYSJ19877 小时前
【java项目分享】springboot阅读推荐平台10600
java·javascript·spring boot·python·django·flask·php
PC2005-cloud7 小时前
PgVector从入门到实战:用PostgreSQL做向量检索,附SpringBoot+MyBatisPlus整合
数据库·spring boot·postgresql
腾渊信息科技公司8 小时前
Spring Boot集成TDengine实战:工业时序数据存储选型与迁移方案
spring boot·后端·tdengine
zoyation8 小时前
Spring Boot集成OAuth2授权码模式的三种登录策略
java·spring boot·后端
xiaoqiMikko1 天前
Dependabot 面板全绿,不代表你的 Tomcat 没洞
java·spring boot
摇滚侠1 天前
SpringBoot 官网 阅读笔记 启用生产就绪功能 端点
spring boot·笔记·后端
evans在进步1 天前
HashMap 为什么线程不安全?ConcurrentHashMap 如何解决?
java·spring boot·spring