国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記一次 MySQL timestamp 精度問題的排查 → 過程有點曲折

這篇具有很好參考價值的文章主要介紹了記一次 MySQL timestamp 精度問題的排查 → 過程有點曲折。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

開心一刻

  下午正準備出門,跟正刷著手機的老媽打個招呼

  我:媽,今晚我跟朋友在外面吃,就不在家吃了

  老媽拿著手機跟我說道:你看這叫朋友騙緬北去了,tm血都抽干了,多危險

  我:那是他不行,你看要是吳京去了指定能跑回來

  老媽:還吳京八經的,特么牛魔王去了都得耕地,唐三藏去了都得打出舍利,孫悟空去了都得演大馬戲

  我:那照你這么說,唐僧師徒取經走差地方了唄

  老媽:那可沒走錯,他當年擱西安出發(fā),他要是擱云南出發(fā)呀,上午到緬北,下午他就到西天

  我:哈哈哈,那西游記就兩級唄,那要是超人去了呢?

  老媽:那超人去了,回來光剩超,人留那了

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

問題復現

  我簡化下業(yè)務與項目

  數據庫:?MySQL 8.0.25?

  基于?spring-boot 2.2.10.RELEASE?搭建?demo?:spring-boot-jpa-demo

  表:?tbl_user?

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  測試代碼:

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折
/**
 * @description: xxx描述
 * @author: 博客園@青石路
 * @date: 2024/1/9 21:42
 */
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class UserTest {

    @Resource
    private UserRepository userRepository;

    @Test
    public void get() {
        DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
        Timestamp lastModifiedTime  = Timestamp.valueOf(LocalDateTime.parse("2024-01-11 09:33:26.643", dft));

        // 1.先保存一個user
        User user = new User();
        user.setUserName("zhangsan");
        user.setPassword("zhangsan");
        user.setBirthday(LocalDate.now().minusYears(25));
        user.setLastModifiedTime(lastModifiedTime);
        log.info("user.lastModifiedTime = {}", user.getLastModifiedTime());
        userRepository.save(user);
        log.info("user 保存成功,userId = {}", user.getUserId());

        // 2.然后再根據id查詢這個user
        Optional<User> userOptional = userRepository.findById(user.getUserId());
        if (userOptional.isPresent()) {
            log.info("從數據庫查詢到的user,user.lastModifiedTime = {}", userOptional.get().getLastModifiedTime());
        }
    }
}
View Code

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  這么清晰的代碼,大家都能看懂吧?

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  我們來看下日志輸出

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  保存的時候,?lastModifiedTime?的值是?2024-01-11 09:33:26.643?,從數據庫查詢得到的卻是:?2024-01-11 09:33:27.0?

  是不是被震驚到了?

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

曲折排查

  先確認下?MySQL?表中存的值是多少

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  數據庫表中的值就是?2024-01-11 09:33:27?,此刻我只想來一句:臥槽!

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  這說明數據入庫有問題,而不是讀取有問題

  我們來梳理下數據入庫經歷了哪些環(huán)節(jié)

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  那問題肯定出在?Spring Data JPA?至?mysql-connector-java?之間

  ?MySQL?肯定是沒問題的!

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  源碼跟蹤

  既然問題出在?Spring Data JPA?與?mysql-connector-java?之間,那么我們就直接來個一穿到底,翻了它的源碼老底

  大家請坐好,我要開始裝逼了

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  ?JPA?用的少,一時還不知道從哪里開始去跟源碼,但不要慌,樓主有?葵花寶典?:雜談篇之我是怎么讀源碼的,授人以漁

  斷點追蹤源碼,一時用一時爽,一直用一直爽

  直接在?userRepository.save(user)?前面打個斷點,然后一步一步往下跟,我就不細跟了,我只在容易跟丟的地方指出來,給你們合適的方向

  當斷點到?SessionImpl#firePersist?方法時

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  我們應該去跟?PersistEventListener::onPersist?了,一路跟下去,會來到?AbstractSaveEventListener#performSaveOrReplicate?方法

  里面有如下代碼

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  添加的?Action?的實際類型是:?EntityIdentityInsertAction?

  這里涉及到了?hibernate?的?事件機制?,簡單來說就是?EntityIdentityInsertAction?的?execute?方法會被調用

  所以我們繼續(xù)從?EntityIdentityInsertAction#execute?跟,會來到?GetGeneratedKeysDelegate#executeAndExtract?

  重點來了,大家打起精神

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  繼續(xù)跟進?session.getJdbcCoordinator().getResultSetReturn().executeUpdate( insert )?的?executeUpdate?

  它長這樣

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  如果不是斷點跟的話

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  你知道接下來跟誰嗎?

  當然,非常熟悉源碼的人(比如我),肯定知道跟誰

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  但是用了斷點,大家都知道跟誰了

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  繼續(xù)往下跟,當我們來到?ClientPreparedStatement#executeInternal?時,真相已經揭曉

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  此時已經來到了?mysql-connector-java?,發(fā)送給?MySQL Server?的?SQL?是:

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  ?last_modified_time?精度沒丟

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  那問題出在哪?

  還能出在哪,?MySQL?唄!

  說好的?MySQL?沒問題的了?

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  MySQL 時間精度

  用排除法,排的只剩?MySQL?了,直接執(zhí)行?SQL?試試

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  哦豁,敢情前面的源碼分析全白分析了,我此刻的心情你們懂嗎

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  這必須得找?MySQL?要個說法,真是太狗了

  我們去?MySQL?官方文檔找找看(注意參考手冊版本要和我們使用的?MySQL?版本一致)

  大家不要通篇去讀,那樣太費時間,直接?search?用起來

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  The DATE, DATETIME, and TIMESTAMP Types 有這么一段比較關鍵

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  我給大家翻譯一下

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  繼續(xù)看?Fractional Seconds in Time Values,內容不多,大家可以通篇讀完

  ?MySQL?的?TIME?,?DATETIME?和?TIMESTAMP?都支持微妙級別(6位數)的小數位

  精度直接在括號中指定,例如:?CREATE TABLE t1 (t TIME(3), dt DATETIME(6))?

  小數位的范圍是 0 到 6。0 表示沒有小數部分,如果小數位缺省,則默認是0(SQL規(guī)范規(guī)定的默認是 6,MySQL8 默認值取 0 是為了兼容 MySQL 以前的版本

  當插入帶有小數部分的?TIME?,?DATETIME?或?TIMESTAMP?值到相同類型的列時,如果值的小數位與精度不匹配時,會進行四舍五入

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  四舍五入的判斷位置是精度的后一位,比如精度是 0,則看值的第 1 位小數,來決定是舍還是入,如果精度是 2,則看值的第 3 位小數

  簡單來說:值的精度大于列類型的精度,就會存在四舍五入,否則值是多少就存多少

  當發(fā)生四舍五入時,既不會告警也不會報錯,因為這就是 SQL 規(guī)范

  那如果我不想要四舍五入了,有沒有什么辦法?

  ?MySQL?也給出了支持,就是啟用?SQL mode?:TIME_TRUNCATE_FRACTIONAL

  啟用之后,當值的精度大于列類型的精度時,就是直接按列類型的精度截取,而不是四舍五入

  那這么看下來,不是?MySQL?的鍋呀,?MySQL?表示這鍋我不背

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  那是誰的鍋?

  只能說是開發(fā)人員的鍋,為什么不按?MySQL?使用說明書使用?

  我要強調的是,產生這次問題的代碼不是我寫的,我寫的代碼怎么可能有?bug?

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

總結

  1、?源碼?debug?堆棧

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  2、MySQL 時間精度

    ?MySQL?的?TIME?,?DATETIME?和?TIMESTAMP?類型都支持微妙級別(6位數)的精度

    默認情況下會四舍五入,若想直接截斷,則需要開啟?SQL mode?:?TIME_TRUNCATE_FRACTIONAL?

  3、規(guī)范

    阿里巴巴的開發(fā)手冊中明確指出不能用:?java.sql.Timestamp?

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

    另外很多公司的?MySQL?開發(fā)規(guī)范會強調:沒有特殊要求,時間類型用?datetime?

    主要出于兩點考慮:1、?datetime?可用于分區(qū),而?timestamp?不行,2、?timestamp?的范圍只到?2038-01-19 03:14:07.499999?

    有的開發(fā)小伙伴可能會問:如果到了?2038-01-19 03:14:07.499999?之后,?timestamp?該怎么辦?

    我只能說:小伙子你想的太遠了,?2038?跟我們有什么關系,影響我們送外賣嗎?

補充

  關于上面講到的?timestamp?不能分區(qū),進行一下補充(感謝 @xiaohuazi?指正)

  它能分區(qū),但是和??DATE??和?DATETIME? 有一丟丟區(qū)別

  MySQL 5.7 說明如下

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  MySQL 8.0 說明如下

記一次 MySQL  timestamp 精度問題的排查 → 過程有點曲折

  ?timestamp?類型的列只能基于?UNIX_TIMESTAMP?函數進行分區(qū)文章來源地址http://www.zghlxwxcb.cn/news/detail-789622.html

到了這里,關于記一次 MySQL timestamp 精度問題的排查 → 過程有點曲折的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 記一次Native memory leak排查過程

    記一次Native memory leak排查過程

    路由計算服務是路由系統(tǒng)的核心服務,負責運單路由計劃的計算以及實操與計劃的匹配。在運維過程中,發(fā)現在長期不重啟的情況下,有TP99緩慢爬坡的現象。此外,在每周例行調度的試算過程中,能明顯看到內存的上漲。以下截圖為這兩個異常情況的監(jiān)控。 TP99爬坡 內存爬坡

    2024年02月11日
    瀏覽(26)
  • 記一次Elasticsearch GeoIpDownloader的啟動異常排查過程

    最近碰到了Elasticsearch GeoIpDownloader相關的一個異常,花費了不少精力排查,故此記錄一下,希望碰到同樣問題的童鞋們少走彎路。 這個異常是在Elasticsearch啟動的過程中報的error,如下所示,從提示信息來看是因為GeoIpDownloader更新數據庫失敗導致。 GeoIpDownloader是用于下載地圖數

    2024年02月02日
    瀏覽(28)
  • 記一次.Net Core程序啟動失敗的排查過程

    閱文時長 | 2分鐘 字數統(tǒng)計 | 3212字符 主要內容 | 1、引言背景 2、排查.NetCore啟動失敗詳細過程 3、聲明與參考資料 『記一次.Net Core程序啟動失敗的排查過程』 編寫人 | SCscHero 編寫時間 | 2021/12/23 PM2:6 文章類型 | 系列 完成度 | 已完成 座右銘 每一個偉大的事業(yè),都有一個微不足

    2024年02月05日
    瀏覽(26)
  • JAVA開發(fā)(記一次504 gateway timeout錯誤排查過程)

    JAVA開發(fā)(記一次504 gateway timeout錯誤排查過程)

    一、問題與背景: 最近在發(fā)布一個web項目,在測試環(huán)境都是可以的,發(fā)布到生產環(huán)境通過IP訪問也是可以的,但是通過域名訪問就出現504 gateway timeout。通過postman去測試接口也是一樣。ip和端口都可以通,域名卻不行,百思不得其解。通過一頓百度搜索,解析說通過nginx配置文

    2024年02月11日
    瀏覽(30)
  • 記一次 Mockito.mockStatic 泄漏導致的單元測試偶發(fā)報錯排查過程

    記一次 Mockito.mockStatic 泄漏導致的單元測試偶發(fā)報錯排查過程

    相信用 Java 寫過單元測試的讀者們對 Mockito 不會陌生。至于 Mockito 是什么,為什么要用 Mockito,本文不再贅述。本文記錄了一次在 Apache ShardingSphere 項目中,由 Mockito.mockStatic 使用不當導致的單元測試偶發(fā)報錯排查過程。 Mockito 自 3.4.0 起新增了一個方法 Mockito.mockStatic ,支持對

    2024年02月10日
    瀏覽(29)
  • 記一次服務器被挖礦的排查過程:xmrig挖礦病毒

    記一次服務器被挖礦的排查過程:xmrig挖礦病毒

    【阿里云】尊敬的aliyun98****8825: 經檢測您的阿里云服務(ECS實例)i-0jl8awxohyxk****axz5存在挖礦活動。根據相關法規(guī)、政策的規(guī)定,請您于2023-07-18 00時前完成挖礦問題整改,否則您的服務將被關停,詳情請查看郵件或阿里云站內消息通知。 若您有其他問題,可登陸阿里云官網在

    2024年02月11日
    瀏覽(27)
  • 記一次docker啟動失敗的問題排查

    記一次docker啟動失敗的問題排查

    以前在虛擬機上安裝了一個docker,可以正常使用的,今天突然宿主機機器內存條壞了,換了內存條后啟動機器,再使用 systemctrl start docker 啟動docker,最后使用 docker start containID 啟動報錯 網上沒有找到相應的描述,仔細分析看是 write /proc/sys/kernel/shmmni 報錯了,錯誤原因是 in

    2024年02月14日
    瀏覽(27)
  • 【記一次線上事故的排查思路】- CPU飆升問題排查

    【記一次線上事故的排查思路】- CPU飆升問題排查

    由于項目排期較緊,臨時從其他組調來三個開發(fā)資源幫我一起做項目,難免上線的時候大家的需求一塊上線。 問題來了,上線三天后,線上CPU總是莫名奇妙的突然飆升,飆升后CPU并未降下來,而是一直處在高點。 由于是線上導致的問題,CPU超限后,會自動重啟項目,未能保

    2024年01月23日
    瀏覽(27)
  • 記一次Apache HTTP Client問題排查

    記一次Apache HTTP Client問題排查

    通過日志查看,存在兩種異常情況。 第一種:開始的時候HTTP請求會報超時異常。 762663363 [2023-07-21 06:04:25] [executor-64] ERROR - com.xxl.CucmTool - CucmTool|sendRisPortSoap error,url:https://xxxxxx/realtimeservice/services/RisPort org.apache.http.conn.HttpHostConnectException: Connect to xxx [/xxx] failed: 連接超時 第二種

    2024年02月12日
    瀏覽(28)
  • 記一次jedis連接池頑固問題排查與修改

    記一次jedis連接池頑固問題排查與修改

    這輩子不想再看到jedisBrokenPipe??! ? 測試環(huán)境運行16天后報錯信息: 05:42:32.629 [http-nio-8093-exec-2] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - [log,175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is redis.clients.jedis.exceptions.JedisCon

    2023年04月21日
    瀏覽(43)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包