都說了能不動就別動,非要去調整,出生產事故了吧

MyBatis 替換成 MyBatis-Plus

背景介紹

一個老項目,數據庫用的是?MySQL?5.7.36?,?ORM?框架用的?MyBatis?3.5.0?,?mysql-connector-java?版本是?5.1.26?

新來了一個干練的小伙,精力充沛,看著就是一個喜歡折騰的主

他就覺得?MyBatis?使用起來不夠簡單,要寫的代碼還比較多,覺得有必要替換成?MyBatis-Plus?

Mybatis-Plus 替換 Mybatis

先準備一張表?tbl_order?,然后初始化 2 條數據

?View Code

為了簡化演示,我就直接用?Mybatis-Plus?搭建一個示例?demo?,以此來模擬下?"小伙"?替換的過程

只是用?MyBatis-Plus?替換?MyBatis?,其他組件的版本暫不動

Mybatis-Plus?版本就用?"小伙"?引用的版本:?3.1.1?,?mysql-connector-java?版本保持不變還是?5.1.26?

示例代碼:play_it_safe

此時運行?com.qsl.OrderTest#orderListAllTest?,會報錯,異常信息如下

?View Code

注意看?Caused by?

不支持的轉換類型:?java.time.LocalDateTime?

誰不支持??mysql-connector-java?不支持!

那?mysql-connector-java?哪個版本支持了,答案是:?5.1.37?

升級mysql-connector-java

將?mysql-connector-java?升級到?5.1.37?,再執行下?com.qsl.OrderTest#orderListAllTest?

不再報異常,查詢結果也正確

MyBatis-Plus?替換?Mybatis?似乎就完成了

順的讓人有點懷疑

Conversion not supported for type java.time.LocalDateTime

我們再回過頭去看看前面說到的異常:?Conversion not supported?for?type java.time.LocalDateTime?

Mybatis-Plus?替換?MyBatis?之前沒這個異常,替換之后就有了這個異常,這不是?Mybatis-Plus?的問題?

如何找這個異常的根因了?

很簡單,直接從異常堆棧入手

點了之后,你會發現方法很簡單

這么簡單的代碼能有什么問題?

大家注意看圖中左上角?MyBatis?的版本,是?3.5.1,并不是最初的 3.5.0

有小伙伴可能會問了:不是用?MyBatis-Plus?替換了?MyBatis?嗎,怎么還有?Mybatis??

這個問題問的真的好,我只想給你個大嘴巴子

你看下?MyBatis-Plus?的官方說明

既然基于?Mybatis?3.5.0?沒有拋異常,而基于?3.5.1?拋了異常,?LocalDateTimeTypeHandler?在?3.5.1?肯定做了調整

我們來看下調整了什么?

看出什么了?

MyBatis 3.5.0?會處理?LocalDateTime?類型的轉換(將?java.sql.Timestamp?轉換成?java.time.LocalDateTime?)

然而,注意了,然而來了!!!

然而從??MyBatis 3.5.1?開始,不再處理?LocalDateTime?(還包括:?LocalDate?、?LocalTime?)類型的轉換

而是交由?JDBC?組件,也就是?mysql-connector-java?來實現

而巧的是,?mysql-connector-java 5.1.26?不支持類型?LocalDateTime?

那它支持哪些類型了?

我們同樣從異常堆棧入手

點了之后,可以看到下圖

往上滑動鼠標,就可以看到支持的類型了

確實沒有?LocalDateTime?、?LocalDate?和?LocalTime?

mysql-connector-java 5.1.37?開始支持?LocalDateTime?、?LocalDate?和?LocalTime?,前面已經介紹過了,不再過多贅述

總結下異常根因:?MyBatis 3.5.1?開始不再處理?LocalDateTime?、?LocalDate?和?LocalTime?的轉換,而?mysql-connector-java 5.1.37?之前都不支持這些類型

弄清楚這個異常的來龍去脈之后,順的是不是又理所當然一些了?

暴風雨的來臨

版本上線沒 2 天,該來的終究還是來了

我們往表?tbl_order?中插入一條記錄:?INSERT INTO `tbl_order` VALUES (3, 'asdfgh', NULL, '2024-02-21 20:01:31.111', '2024-02-21 20:02:56.764');?

再執行?com.qsl.OrderTest#orderListAllTest?

此刻我就想問?"小伙"?:刺不刺激?

碰到了異常,那就找原因

同樣從異常堆棧入手

看出什么了?

如果?getTimestamp(columnIndex)?得到的是?NULL?,不就?NullPointerException?? 嚴謹性了?

修復問題要緊,我們先看哪個版本進行修復了?

將?mysql-connector-java?升級到?5.1.42?

問題得以修復

經此一役,?"小伙"?似乎成長了很多,但眼里的光卻暗淡了不少

mybatis-plus-issues-1114

無意中看到了這個issue-1114,跟我們前面分析的?Conversion not supported?for?type java.time.LocalDateTime?是不是同一個問題?

只是我們用到的數據庫連接池是默認的?HikariCP?而非?Druid?

結合druid/issues/3302來看,如果使用?Druid?作為數據庫連接池,出現的異常可能跟我們前面分析的確實不一樣

所以大家需要根據自己的實際情況來分析,但針對異常的分析方法是通用的

修了“不該修的Bug”

這是我親身經歷的一次事故,到現在都覺得這鍋背的有點冤

背景介紹

文件分為主文件和附屬文件,主文件生成之后再生成附屬文件

附屬文件生成的時候,會校驗其依賴的主文件是否都生成了,如果有任意一個主文件未生成,依賴文件不能生成并拋出異常

這個業務還是比較簡單吧

但在附屬文件校驗的優化上,我背上了生產事故

優化前的校驗

listFileGenerateLog?作用是根據參數查詢文件生成記錄,具體實現不用關注

這個校驗邏輯是什么?只要有任意一個主文件生成,校驗就算通過了,與業務要求(主文件全部生成,才算校驗通過)不匹配呀

這不是妥妥的?Bug??

優化后的校驗

碰到?Bug?你能忍?我是忍不了一點,反手就是一個優化

這是不是就符合業務要求了?

生產異常

中午升級之后,穩定運行了一段時間,期間文件正常生成,沒出現任何問題

晚上 19 點,有個附屬文件生成失敗,異常提示:?依賴的資源[abc_{yyyyMMdd}.txt]未生成?

當時看到這個異常的第一眼,覺得既熟悉又陌生,熟悉的是這個異常信息的結構,陌生的是?abc_{yyyyMMdd}.txt?,這不是文件名嗎?

正常來講應該是?fileId?,是一個自增的正整數呀,怎么會是文件名了?

腦中瞬間閃過一個念頭:數據庫數據有問題?

一查嚇一跳,這個附屬文件關聯主文件的字段值是:?4356,abc_{yyyyMMdd}.txt?,看最終修改時間是:?2021-08-21 15:22:12.652?

4356?文件的文件名就是?abc_{yyyyMMdd}.txt?,正常來講,這個關聯字段的值應該是:?4356?

敢情這個?校驗Bug?完美的兼容了這個臟數據?,所以幾年了,一直沒出現異常

是不是有這味了?

這可倒好,我把?Bug?修好,還出現問題了,你說我是不是手賤?

經此一役,我眼里的光又暗淡了些許

總結

關于對組件的升級,或者對舊代碼的調整,都有可能牽一發動全身,影響甚大。

我的觀點是:能不動就不要動,改好沒績效,改出問題要背鍋,吃力不討好,又不是不能跑。

如果到了不得不改的地步了,那就需要全面的測試。

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

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

相關文章

leetcode 3.1

leetcode hot 100 雙指針1.三數之和2.接雨水 多維動態規劃1.最長公共子序列 雙指針 1.三數之和 三數之和 排序 雙指針的方法&#xff0c;固定一個數nums[i], 用兩數和找target - nums[i] 的數需要注意兩點: 1.需要去掉重復數字 while (l < r && nums[l] nums[…

社交APP開發能給用戶帶來什么

現在的社交軟件也非常的多&#xff0c;每款社交軟件都有自己的特色&#xff0c;社交軟件是日常中必備的軟件&#xff0c;不管是生活交流還是感情工作交流都是比較方便的&#xff0c;因為社交軟件滿足了日常的遠程交流問題&#xff0c;所以開發社交軟件也會逐漸的流行起來的。 …

Error: T doesn‘t have .length

Error: T doesn‘t have .length 在 TypeScript 中&#xff0c;當我們使用泛型 <T> 時&#xff0c;有時會遇到一個常見問題&#xff1a;編譯器提示錯誤&#xff0c;指出泛型類型 T 不具備 .length 屬性。在本文中&#xff0c;我們將探討這個問題的解決方案&#xff0c;并…

【Qt學習】QLCDNumber的介紹與實例使用(倒計時功能)

文章目錄 1. 介紹2. 實例 - QLCDNumber倒計時3. 資源文件 1. 介紹 QLCDNumber是Qt框架中用于顯示數字的控件&#xff0c;它模擬了一個液晶數字顯示屏。 在Designer界面中顯示如下&#xff1a; 有以下 常用屬性&#xff1a; 屬性描述intValue獲取或設置QLCDNumber顯示的整數…

Redis高級特性詳解:事務處理、發布訂閱、持久化和集群

Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的基于內存的數據結構存儲系統&#xff0c;被廣泛應用于緩存、隊列、計數器等場景中。除了基本的鍵值存儲功能外&#xff0c;Redis還提供了許多高級特性&#xff0c;包括事務處理、發布訂閱、持久化和集群。在…

js截取圖片地址后面的參數和在路徑中截取文件名或后綴名

文章目錄 前言截取地址 &#xff1f;后面的參數在路徑中截取文件名或后綴名總結 前言 在處理網頁上的圖片資源或者其他類型的文件資源時&#xff0c;你可能會遇到需要使用這些技巧的情況。以下是一些具體的使用場景&#xff1a; 動態修改圖片參數&#xff1a;如果你有一個圖片U…

【BBuf的CUDA筆記】十四,OpenAI Triton入門筆記三 FusedAttention

0x0. 前言 繼續Triton的學習&#xff0c;這次來到 https://triton-lang.org/main/getting-started/tutorials/06-fused-attention.html 教程。也就是如何使用Triton來實現FlashAttention V2。對于FlashAttention和FlashAttention V2網上已經有非常多的介紹了&#xff0c;大家如…

Win11系統安裝安卓子系統教程

隨著Win11系統的不斷普及&#xff0c;以及硬件設備的更新換代&#xff0c;我相信很多同學都已經更新并使用到了最新的Win11系統。那么&#xff0c;Win11系統最受期待的功能“Windows Subsystem for Android”&#xff08;簡稱WSA&#xff09;&#xff0c;即《安卓子系統》。他可…

spring.factories的常用配置項

概述 spring.factories 實現是依賴 spring-core 包里的 SpringFactoriesLoader 類&#xff0c;這個類實現了檢索 META-INF/spring.factories 文件&#xff0c;并獲取指定接口的配置的功能。 Spring Factories機制提供了一種解耦容器注入的方式&#xff0c;幫助外部包&am…

掘根寶典之C語言字符串輸入函數(gets(),fgets(),get_s())

字符串輸入前的注意事項 如果想把一個字符串讀入程序&#xff0c;首先必須預留該字符串的空間&#xff0c;然后用輸入函數獲取該字符串 這意味著必須要為字符串分配足夠的空間。 不要指望計算機在讀取字符串時順便計算它的長度&#xff0c;然后再分配空間(計算機不會這樣做&a…

ai圖生文的軟件!分享4個受歡迎的!

在數字化時代&#xff0c;隨著人工智能技術的飛速發展&#xff0c;AI圖生文軟件已經成為自媒體人、創作者和廣告從業者手中的得力助手。這些軟件能夠將靜態的圖片轉化為生動的文字&#xff0c;為圖片注入靈魂&#xff0c;讓觀者仿佛置身于畫面之中。今天&#xff0c;就讓我們一…

LabVIEW和Python開發微細車削控制系統

LabVIEW和Python開發微細車削控制系統 為滿足現代精密加工的需求&#xff0c;開發了一套基于LabVIEW和Python的微細車削控制系統。該系統通過模塊化設計&#xff0c;實現了高精度的加工控制和G代碼的自動生成&#xff0c;有效提高了微細車削加工的自動化水平和編程效率。 項目…

cjson報錯

今天遇到個問題&#xff0c;使用CJSON把一個cjson對象給一個cjson對象的時候報錯&#xff0c;是segment問題 &#xff0c;原因是我在個cjson對象數據的時候&#xff0c;有幾個是char的&#xff0c;但是是個時間的字符串&#xff0c;一般20位就夠了&#xff0c;但是由于是通過mo…

1950-2022年各省逐年平均降水量數據

1950-2022年各省逐年平均降水量數據 1、時間&#xff1a;1950-2022年 2、指標&#xff1a;省逐年平均降水量 3、范圍&#xff1a;33省&#xff08;不含澳門&#xff09; 4、指標解釋&#xff1a;逐年平均降水數據是指當年的日降水量的年平均值&#xff0c;不是累計值&#…

ONLYOFFICE 桌面編輯器 v8.0 更新內容詳細攻略

文章目錄 引言PDF 表單RTL 支持電子表格中的新增功能Moodle 集成用密碼保護 PDF 文件從“開始”菜單快速創建文檔本地界面主題下載安裝桌面編輯工具總結 引言 官網鏈接&#xff1a; ONLYOFFICE 官方網址 ONLYOFFICE 桌面編輯器是一款免費的文檔處理軟件&#xff0c;適用于 Li…

面試經典 150 題 ---- 買賣股票的最佳時機 II

面試經典 150 題 ---- 買賣股票的最佳時機 II 買賣股票的最佳時機II方法一&#xff1a;貪心 買賣股票的最佳時機II 方法一&#xff1a;貪心 貪心策略&#xff0c;我們可以考慮局部最優以達到整體最優&#xff0c;僅需要判斷相鄰兩天之間的利潤是否大于 0&#xff0c;若大于 0…

uniapp實現-審批流程效果

一、實現思路 需要要定義一個變量, 記錄當前激活的步驟。通過數組的長度來循環數據&#xff0c;如果有就采用3元一次進行選擇。 把循環里面的變量【name、status、time】, 全部替換為取出的那一項的值。然后繼續下一次循環。 虛擬的數據都是請求來的, 組裝為好渲染的格式。 二…

【打工日常】使用docker部署在線PDF工具

一、Stirling-PDF介紹 Stirling-PDF是一款功能強大的本地托管的基于 Web 的 PDF 操作工具&#xff0c;使用 docker部署。該自托管 Web 應用程序最初是由ChatGPT全權制作的&#xff0c;現已發展到包含廣泛的功能來處理您的所有 PDF 需求。允許對 PDF 文件執行各種操作&#xff0…

基于session注冊JAva篇springboot

springboot3全家桶&#xff0c;數據庫 &#xff1a;redis&#xff0c;mysql 背景環境&#xff1a;郵箱驗證碼&#xff0c;驗證注冊 流程&#xff1a;先通過郵箱驗證&#xff0c;發送驗證碼&#xff0c;將獲取到的session和驗證碼&#xff0c;存入redis里&#xff08;發送郵箱…

【leetcode】鏈表的回文結構

大家好&#xff0c;我是蘇貝&#xff0c;本篇博客帶大家刷題&#xff0c;如果你覺得我寫的還不錯的話&#xff0c;可以給我一個贊&#x1f44d;嗎&#xff0c;感謝?? 點擊查看題目 思路: 1.找中間節點 找中間節點的方法在下面這個博文中詳細提過 【點擊進入&#xff1a;【l…