当前位置: 首页 > article >正文

【Bug】定时任务中 Jpa Save 方法失效

【Bug】定时任务中 Jpa Save 方法失效

首先说一下问题,在定时任务中调用 jpa 的 save 方法没有效果,但是通过外界调用,比如 controller 中注入 service 来调用是可以的,真是巨巨巨离谱,我被折磨了好几天。

我这个问题的根源在于多数据源的配置上,所以如果你的项目中没有使用多数据源,那接下来的内容应该对你没什么帮助了~

一般来讲,在配置多数据源的时候,除了要继承 AbstractRoutingDataSource 类

package com.xsdl.content;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class MultiDataSource extends AbstractRoutingDataSource {private static final ThreadLocal<String> keys = new ThreadLocal<String>();@Overrideprotected Object determineCurrentLookupKey() {return keys.get();}public static void setDataSource(String dataSource) {keys.set(dataSource);}public static String getDatasource() {return keys.get();}public static void clearDataSource() {keys.remove();}}

还会配置对应数据源的 datasource、jdbcTemplate 等

package com.xsdl.config;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Configuration
public class MultiDataSourceConfig {@Bean(name = "dataSourceAAA")@Primary@ConfigurationProperties("spring.aaa.datasource")public DataSource dataSourceAAA() {return DataSourceBuilder.create().build();}@Bean(name = "dataSourceBBB")@ConfigurationProperties("spring.bbb.datasource")public DataSource dataSourceBBB() {return DataSourceBuilder.create().build();}@Bean(name = "multiDataSource")public MultiDataSource multipleDataSource(@Qualifier("dataSourceAAA") DataSource dataSourceA,@Qualifier("dataSourceBBB") DataSource dataSourceB) {Map<Object, Object> map = new HashMap<>();map.put("dataSourceA", dataSourceA);map.put("dataSourceB", dataSourceB);MultiDataSource multipleDataSource = new MultiDataSource();multipleDataSource.setDefaultTargetDataSource(dataSourceA);multipleDataSource.setTargetDataSources(map);return multipleDataSource;}@Beanpublic JdbcTemplate jdbcTemplate(MultiDataSource multipleDataSource) {return new JdbcTemplate(multipleDataSource);}@Bean@Primary@Description("事务管理器")public PlatformTransactionManager transactionManager(@Qualifier("multiDataSource") MultiDataSource multiDataSource) {return new DataSourceTransactionManager(multiDataSource);}}

事情到现在是很正常的,启动项目也可以正常启动,正常在 service 的业务逻辑里调用对应的 dao 或者 repository 去保存数据也可以

突然有一天,我接到一个需求,有一个接收记录的表,我需要定时从中查询执行失败的,重试进行补偿,那我补偿完成后,当然要更新回去对吧,于是我写了一个类似下面这样的代码:

package com.xsdl.job;import com.xsdl.dao.UserDao;
import com.xsdl.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.util.UUID;
import java.util.stream.IntStream;@Component("tsJob")
@Slf4j
public class TsJob {@Autowiredprivate UserDao userDao;@Scheduled(cron = "0 0/2 * * * ?")public void execute() {log.warn("定时任务开始执行");IntStream.rangeClosed(1, 10).forEach(i -> {User user = new User();user.setUuid(UUID.randomUUID().toString());user.setName("name" + i);userDao.save(user);});log.warn("定时任务执行结束");}}

具体逻辑不用关注,就是查数据库,然后修改了几个字段,重新 save 回去,这时候问题出现了,save 方法执行无效,数据库里数据没更新,我一路 debug,期间各种磕磕绊绊,就是找不到问题,反而找到了几个同病相怜的人:

[在spring的定时任务中使用 jpa 的save 方法失效](https://forum.springdoc.cn/t/topic/776)

no transaction is in progress

我一开始以为是事务的开启问题,包括但这样尝试:

    @Scheduled(cron = "0 0/2 * * * ?")public void execute() {log.warn("定时任务开始执行");IntStream.rangeClosed(1, 10).forEach(i -> {User user = new User();user.setUuid(UUID.randomUUID().toString());user.setName("name" + i);getThis.doSave(user);});log.warn("定时任务执行结束");}@Transactional(propagation = Propagation.New)public void doSave(User user) {userDao.save(user);}private TsJob getThis() {return ApplicationContextUtil.getBean("tsJob",TsJob.class);}

然而什么用都没有

最关键的是,这个方法如果在一个 controller 里手动调用是可以执行的,我觉得太离谱了,就想开个新项目复现一下,结果怎么都复现不出来,最后突然觉得区别也就是在多数据源上了,中间各种尝试,直到我把这个代码注释掉,终于可以了~

    @Bean@Primary@Description("事务管理器")public PlatformTransactionManager transactionManager(@Qualifier("multiDataSource") MultiDataSource multiDataSource) {return new DataSourceTransactionManager(multiDataSource);}

如果你的项目里也这样配置了 transactionManager ,可能就是这个问题~

相关文章:

【Bug】定时任务中 Jpa Save 方法失效

【Bug】定时任务中 Jpa Save 方法失效 首先说一下问题&#xff0c;在定时任务中调用 jpa 的 save 方法没有效果&#xff0c;但是通过外界调用&#xff0c;比如 controller 中注入 service 来调用是可以的&#xff0c;真是巨巨巨离谱&#xff0c;我被折磨了好几天。 我这个问题…...

英语科研词汇现象及语言演变探讨

一、词汇形态学的进化困境 希腊-拉丁语系遗存 "Pneumoconiosis"&#xff08;πνεύμωνκονίαωσις&#xff09;和"electroencephalogram"&#xff08;ηλεκτρονεγκέφαλοςγράμμα&#xff09;的构词方式反映了欧洲学者对古…...

C# 打印PDF的常用方法

这里先提供一个helper类的模板 1.使用默认程序打印 using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing.Printing; using System.IO; using System.Runtime.InteropServices;namespace PDF {public static class PrintHelper{#…...

若依微服务的定制化服务

复制依赖 复制依赖 复制system服务的bootstrap.yml文件&#xff0c;修改port和name 在nacos复制一个新的nacos配置&#xff0c;修改对应的nacos的配置 &#xff0c;可能不需要修改&#xff0c;看情况。 网关修改 注意curd的事项&#xff0c;模块名称的修改...

Axios 如何通过配置实现通过接口请求下载文件

前言 今天&#xff0c;我写了 《Nodejs 实现 Mysql 数据库的全量备份的代码演示》 和 《NodeJS 基于 Koa, 开发一个读取文件&#xff0c;并返回给客户端文件下载》 两篇文章。在这两篇文章中&#xff0c;我实现了数据库的备份&#xff0c;和提供数据库下载等接口。 但是&…...

小表驱动大表更快吗,不是

背景 head头表&#xff08;5000&#xff09;&#xff0c;line行表&#xff08;15万&#xff09;&#xff0c;导出数据包含头和行&#xff0c;一对多。 以行表为维度导出15万数据。 sql 如下两个sql查询&#xff0c;有如下差异 驱动方式&#xff1a;第一个大表驱动小表&…...

20250529-C#知识:运算符重载

C#知识&#xff1a;运算符重载 运算符重载能够让我们像值类型数据那样使用运算符对类或结构体进行运算&#xff0c;并且能够自定义运算逻辑。 1、运算符重载及完整代码示例 作用是让自定义的类或者结构体能够使用运算符运算符重载一定是public static的可以把运算符看成一个函…...

【HW系列】—目录扫描、口令爆破、远程RCE流量特征

本文仅用于技术研究&#xff0c;禁止用于非法用途。 文章目录 目录扫描漏洞的流量特征及检测方法一、基础流量特征二、工具特征差异三、绕过行为特征四、关联行为特征五、检测与防御建议 口令爆破漏洞的流量特征及检测方法一、基础流量特征二、工具标识特征三、绕过行为特征四…...

如何在WordPress网站中添加相册/画廊

在 WordPress 网站上添加相册可以让您展示许多照片。无论您是在寻找标准的网格相册画廊还是独特的瀑布流相册画廊体验&#xff0c;学习如何在 WordPress 网站上添加相册总是一个好主意。在本教程中&#xff0c;我们将介绍两种为 WordPress 网站添加相册的方法&#xff1a;使用区…...

【NLP基础知识系列课程-Tokenizer的前世今生第一课】Tokenizer 是什么?为什么重要?

语言的“颗粒度”&#xff1a;我们到底在切什么&#xff1f; 我们都知道模型要处理文本&#xff0c;第一步是把一段段字符变成“token”。但这些 token 究竟应该是句子、单词&#xff0c;还是更小的片段&#xff0c;比如“un break able”&#xff1f; 这背后涉及的是一个非…...

Codeforces Round 1025 (Div. 2)

Problem - A - Codeforces 查有没有人说谎&#xff0c;有一个必错的情况&#xff1a; 两个人都说输了&#xff0c;必有人撒谎&#xff0c;还有就是所有人都赢了&#xff0c;也是撒谎 来看代码&#xff1a; #include <iostream> #include <vector> using namespa…...

Ubuntu20.04操作系统ssh开启oot账户登录

文章目录 1 前提2 设置root密码3 允许ssh登录root账户3.1 编辑配置文件3.2 重启ssh服务 4 安全注意事项 1 前提 ssh可以使用普通用户正常登录。 2 设置root密码 打开终端&#xff0c;设置密码 sudo passwd root # 设置root密码3 允许ssh登录root账户 3.1 编辑配置文件 su…...

类欧几里得算法(floor_sum)

文章目录 普通floor_sum洛谷P5170 【模板】类欧几里得算法 万能欧几里得算法求 ∑ i 1 n A i B ⌊ a i b c ⌋ \sum_{i1}^{n}A^iB^{\lfloor \frac{aib}{c} \rfloor} ∑i1n​AiB⌊caib​⌋求 ∑ i 0 n ⌊ a i b c ⌋ \sum_{i0}^n \lfloor\frac{aib}{c}\rfloor ∑i0n​⌊caib…...

每日Prompt:卵石拼画

提示词 世界卵石拼画大师杰作&#xff0c;极简风格&#xff0c;贾斯汀.贝特曼的风格&#xff0c;彩色的鹅卵石&#xff0c;斑马头像&#xff0c;鹅卵石拼画&#xff0c;马卡龙浅紫色背景&#xff0c;自然与艺术的结合&#xff0c;新兴的艺术创作形式&#xff0c;石头拼贴画&am…...

湖北理元理律师事务所观察:债务优化如何成为民生安全网

据央行2023年报告&#xff0c;中国家庭债务收入比达137.8%。面对债务高压&#xff0c;湖北理元理律师事务所的实践揭示&#xff1a;专业债务规划的价值不仅是减负数字&#xff0c;更是构建社会稳定的微观防线。 一、从“催收恐惧”到“主动管理”的转变 该所服务数据显示&…...

AI时代新词-机器学习即服务(MLaaS)

一、什么是机器学习即服务&#xff08;MLaaS&#xff09;&#xff1f; 机器学习即服务&#xff08;Machine Learning as a Service&#xff0c;简称MLaaS&#xff09;是一种云计算服务模式&#xff0c;它将机器学习工具和平台作为服务提供给用户。用户可以通过云平台访问机器学…...

设计模式简述(二十)规格模式

规格模式 描述组件 使用 描述 规格模式并不在传统的23设计模式中&#xff0c;属于后面扩展的设计模式。 简单描述就是对一批数据进行多条件&#xff08;包括逻辑组合、有点装饰器的感觉&#xff0c;可以不断套娃&#xff09;匹配。 组件 实体 package dp.spec;/*** TODO** …...

符合Python风格的对象(覆盖类属性)

覆盖类属性 Python 有个很独特的特性&#xff1a;类属性可用于为实例属性提供默认 值。Vector2d 中有个 typecode 类属性&#xff0c;bytes 方法两次用到了 它&#xff0c;而且都故意使用 self.typecode 读取它的值。因为 Vector2d 实 例本身没有 typecode 属性&#xff0c;所…...

题目 3314: 蓝桥杯2025年第十六届省赛真题-魔法科考试

题目 3314: 蓝桥杯2025年第十六届省赛真题-魔法科考试 时间限制: 3s 内存限制: 512MB 提交: 245 解决: 49 题目描述 小明正在参加魔法科的期末考试&#xff0c;考生需要根据给定的口诀组合出有效的 魔法。其中&#xff0c;老师给定了 n 个上半部分口诀 a1, a2, . . . , an 和 m…...

Java八股-Java优缺点,跨平台,jdk、jre、jvm关系,解释和编译

java优势劣势&#xff1f; 优势&#xff1a;面向对象&#xff0c;平台无关&#xff0c;垃圾回收&#xff0c;强大的生态系统 劣势&#xff1a;运行速度慢&#xff08;相比于c和rust这样的原生编译语言会比较慢&#xff09;&#xff0c;语法繁琐&#xff08;相比于python&…...

linux 内核态和用户态定时器函数使用总结

1&#xff0c;场景总结 定时器类型精度范围适用场景注意事项用户态信号定时器秒级简单任务调度、心跳检测信号处理函数中不可调用非异步安全函数timerfdepoll纳秒级高精度事件循环、多媒体处理需要配合IO多路复用机制使用内核timer_list毫秒级设备驱动、硬件交互基于jiffies时…...

支持selenium的chrome driver更新到136.0.7103.113

最近chrome释放新版本&#xff1a;136.0.7103.113 如果运行selenium自动化测试出现以下问题&#xff0c;是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…...

硬件服务器基础

1、硬件服务器基础 2、服务器后面板 3、组件 3.1 CPU 3.2 内存 3.3 硬盘 3.4 风扇 4、服务器品牌 4.1 配置 4.2 CPU 架构 4.2.1 CPU 命名规则 4.2.2 服务器 CPU 和家用 CPU 的区别 4.2.3 CPU 在主板的位置 4.2.4 常见 CPU 安装方式 4.3 内存中组件 4.3.1 内存的分类 4.3.1.1 …...

LVS的DR模式部署

目录 一、引言&#xff1a;高并发场景下的流量调度方案 二、LVS-DR 集群核心原理与架构设计 &#xff08;一&#xff09;工作原理与数据流向 数据包流向步骤3&#xff1a; &#xff08;二&#xff09;模式特性与53网络要求 三、实战配置&#xff1a;从9环境搭建到参数调整…...

TRS收益互换平台开发实践:从需求分析到系统实现

一、TRS业务概述 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;允许投资者通过支付固定或浮动利息&#xff0c;换取标的资产&#xff08;如股票、指数&#xff09;的收益权。典型应用场景包括&#xff1a; ​​跨境投资​​&#xff…...

测试Bug篇

本节概要&#xff1a; 软件测试的生命周期 bug的概念 buh要素 bug等级 bug生命周期 对于bug的定级与开发发生冲突如何解决 一、 软件测试的⽣命周期 软件测试贯穿于软件的整个生命周期&#xff0c;针对这句话我们⼀起来看⼀下软件测试是如何贯穿软件的整个生命周期。 软…...

【Linux系统移植】Cortex-A8 Linux系统移植(超详细)

目录 前言 一、ARM开发板ARM简介RISC和CISCARM产品分布核心板S5pv210 SOC嵌入式系统开发方式 二、嵌入式系统组成为什么要系统移植内核移植框图 三、嵌入式开发环境搭建搭建开发环境总流程设置ubuntu与windows共享目录修改用户为root用户安装NFS服务器安装tftp服务器安装交叉编…...

第十五届蓝桥杯大赛软件赛国赛Python 大学 C 组试做【本期题单: 设置密码、栈】

早上好啊大伙&#xff0c;这一期依旧是蓝桥杯备赛刷题的记录。 本期题单&#xff1a;设置密码、栈 前言 前段时间准备省赛&#xff0c;运气好进国赛了。所以就开始准备6月份的国赛。但是近期还有别的比赛要准备&#xff0c;所以刷题的速度比较慢&#xff0c;可能每一期就会有一…...

报错SvelteKitError: Not found: /.well-known/appspecific/com.chrome.devtools.json

报错信息 SvelteKitError: Not found: /.well-known/appspecific/com.chrome.devtools.json 解决方案一 更新所有依赖 npm update解决方案二&#xff08;不一定成功&#xff09; src\lib\hooks.server.ts&#xff0c;每次请求服务器时执行 import type { Handle } from &…...

word添加页眉

问题一&#xff1a; 为word文档添加页眉。 方法&#xff1a; 1、在要添加页眉的第一页页面顶端双击页眉区域&#xff0c;如果添加页眉页上面还有其他页或者与上一页添加页眉内容不同&#xff0c;记得取消“链接到前一节”&#xff08;点击使其上面没有灰色即可&#xff09;&…...