【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 ,可能就是這個問題~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81778.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Redis】熱點key問題,的原因和處理,一致性哈希,刪除大key的方法

熱點 Key 指單個 Key 被高并發訪問&#xff08;如爆款商品&#xff09;&#xff0c;導致 Redis 壓力驟增。解決方案應針對 “單個 Key 高并發”&#xff1a; 分片緩存&#xff1a;將熱點 Key 分散到不同 Redis 節點&#xff08;如按一致性哈希算法分片&#xff09;。本地緩存&…

通過遠程桌面連接Windows實例提示“出現身份驗證錯誤,無法連接到本地安全機構”錯誤怎么辦?

本文介紹通過遠程桌面連接Windows實例提示“出現身份驗證錯誤無法連接到本地安全機構”錯誤的解決方案。 問題現象 通過本地電腦內的遠程桌面連接Windows實例提示“出現身份驗證錯誤&#xff0c;無法連接到本地安全機構”錯誤。 問題原因 導致該問題的可能原因如下&#x…

[python] argparse怎么指定bool類型?

前述 最近在寫腳本的時候想要實現一個if 操作&#xff0c;通過用戶輸入。確定要不要啟用某個語句。 非常自然的就是使用python的argparse包&#xff0c;但是發現了一個陷阱&#xff0c;記錄下。 陷阱 argparse.ArgumentParser() 可以指定輸入類型&#xff0c;我可以設定為bo…

Rust 學習筆記:迭代器

Rust 學習筆記&#xff1a;迭代器 Rust 學習筆記&#xff1a;迭代器Iterator trait 和 next 方法使用迭代器的方法生成其他迭代器的方法使用閉包捕獲它們的環境 Rust 學習筆記&#xff1a;迭代器 在 Rust 中&#xff0c;迭代器負責遍歷每個項的邏輯。迭代器是懶惰的&#xff0…

【深度剖析】義齒定制行業數字化轉型模式創新研究(上篇2:痛點和難點分析)

數字化轉型正在重塑義齒行業的生態格局,但也面臨技術融合與模式變革的深層挑戰。當前,義齒定制行業正處于從傳統手工制造向全流程數字化制造轉型的關鍵階段。3D掃描、CAD/CAM(計算機輔助設計與制造)、3D打印等技術的廣泛應用,顯著提升了義齒制作的精度和效率。傳統石膏模型…

window安裝nginx

步驟1&#xff1a;下載Nginx for Windows? 訪問Nginx官網下載頁面&#xff1a;https://nginx.org/en/download.html 在??Stable version??&#xff08;穩定版&#xff09;下找到Windows版本&#xff0c;點擊下載.zip文件&#xff08;如 nginx-1.28.0.zip&#xff09; 步…

氣象算法工程師學習路徑

目錄 &#x1f324;? 氣象學與數值預報基礎課程&#x1f916; 氣象人工智能與數據分析課程&#x1f4d8; 進階與實戰課程推薦&#x1f9ed; 學習建議與路徑規劃 如果希望成為一名氣象算法工程師&#xff0c;并尋找深入淺出、理論與實踐結合的學習資源&#xff0c;以下是為你精…

回調函數的理解

int yuxiangrousi 0; // 全局變量&#xff1a;魚香肉絲&#xff08;醬油量&#xff09;// 回調函數&#xff1a;媽媽處理醬油&#xff08;將醬油加入魚香肉絲&#xff09; void mother_callback(int new_jiangyou) {yuxiangrousi new_jiangyou; // 把醬油放進魚香肉絲 }// 孩…

多部手機連接同一wifi的ip一樣嗎?如何更改ip

通常情況下&#xff0c;多部手機連接同一個WiFi時&#xff0c;它們的IP地址是各不相同的&#xff08;在局域網內&#xff09;。但是&#xff0c;從互聯網&#xff08;外網&#xff09;的角度看&#xff0c;它們共享同一個公網IP地址。讓我詳細解釋一下&#xff0c;并說明如何更…

環境溫度通過H2A.Zub和H3K27me3動態調控擬南芥細胞命運決定

2025年4月22日&#xff0c;中國科學院遺傳與發育生物學研究所肖軍研究組在Developmental Cell在線發表了題為Dynamic control of H2A.Zub and H3K27me3 by ambient temperature during cell fate determination in Arabidopsis的研究論文&#xff0c;本研究綜合運用ChIP-seq、C…

2024 吉林 CCPC

文章目錄 2024 吉林 CCPCL. Recharge&#xff08;思維、分配&#xff09;G. Platform Game(模擬)E. Connect Components (排序、思維)D. Parallel Lines 2024 吉林 CCPC 題目鏈接&#xff1a; Dashboard - The 2024 CCPC National Invitational Contest (Changchun) , The 17…

day13 leetcode-hot100-24(鏈表3)

234. 回文鏈表 - 力扣&#xff08;LeetCode&#xff09; 1.轉化法 思路 將鏈表轉化為列表進行比較 復習到的知識 arraylist的長度函數&#xff1a;list.size() 具體代碼 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode ne…

Vim文本編輯器快捷鍵用法以及簡單介紹

目錄 vim文本編輯器 簡介&#xff1a; 語法&#xff1a; vim模式介紹&#xff1a; 模式切換&#xff1a; 用法&#xff1a; 編輯模式&#xff1a; 一般模式&#xff1a; 命令模式&#xff1a; vim文本編輯器 簡介&#xff1a; 在命令行界面下&#xff0c;最常用的文本…

從 0 到 1:Spring Boot 與 Spring AI 深度實戰(基于深度求索 DeepSeek)

在人工智能技術與企業級開發深度融合的今天&#xff0c;傳統軟件開發模式與 AI 工程化開發的差異日益顯著。作為 Spring 生態體系中專注于 AI 工程化的核心框架&#xff0c;Spring AI通過標準化集成方案大幅降低 AI 應用開發門檻。本文將以國產大模型代表 ** 深度求索&#xff…

[Windows] 摸魚小工具:隱藏軟件(重制版)

由吾愛大神寫的摸魚工具&#xff1a; 數據存放路徑為C:\Users\用戶名\AppData\Local\HideSoft&#xff0c;如果不想用時&#xff0c;刪除軟件及此路徑下的HideSoft文件夾。如添加了開機啟動&#xff0c;刪除啟動菜單文件夾的快捷方式即可&#xff0c;或者刪除前在軟件中取消設置…

C++ 判斷文件的編碼類型

大多數文本編輯器&#xff0c;都會在文本文件的頭部插入一部分特殊的字節&#xff0c;用于輔助文本編輯器來判斷該文件的字符集編碼類型。 如&#xff1a;記事本 目前支持的字符集類型&#xff0c;通常為三種&#xff1a; Unicode、UTF8、UnicodeBIG、CP_ACP&#xff08;默認…

時間序列噪聲模型分析軟件推薦與使用經驗

最近在論文大修2024年投稿的一篇文章&#xff0c;大修了2輪&#xff0c;最后一次還是重新投稿&#xff0c;其中有一個問題一直被審稿人懟&#xff0c;他認為我計算時間序列的趨勢的時候&#xff0c;沒有考慮時間的相關性&#xff0c;即對噪聲模型的估計不合理&#xff0c;會影響…

【redis實戰篇】第六天

摘要&#xff1a; 本文介紹了基于Redis的秒殺系統優化方案&#xff0c;主要包含兩部分&#xff1a;1&#xff09;通過Lua腳本校驗用戶秒殺資格&#xff0c;結合Java異步處理訂單提升性能&#xff1b;2&#xff09;使用Redis Stream實現消息隊列處理訂單。方案采用Lua腳本保證庫…

【Java Web】速通HTML

參考筆記: JavaWeb 速通HTML_java html頁面-CSDN博客 目錄 一、前言 1.網頁組成 1 結構 2 表現 3 行為 2.HTML入門 1 基本介紹 2 基本結構 3. HTML標簽 1 基本說明 2 注意事項 4. HTML概念名詞解釋 二、HTML常用標簽匯總 + 案例演示 1. 字體標簽 font (1)定義 (2)案例 2…

Oracle/openGauss中,DATE/TIMESTAMP與數字日期/字符日期比較

ORACLE 運行環境 openGauss 運行環境 0、前置知識 ORACLE&#xff1a;DUMP()函數用于返回指定表達式的數據類型、字節長度及內部存儲表示的詳細信息 SELECT DUMP(123) FROM DUAL; -- Typ2 Len3: 194,2,24 SELECT DUMP(123) FROM DUAL;-- Typ96 Len3: 49,50,51 -- ASCII值&am…