AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

是什么導(dǎo)致了,寫入MySQL庫表時間不正確?—— 官網(wǎng)也有Bug!

來源: 責(zé)編: 時間:2024-09-10 09:46:53 117觀看
導(dǎo)讀圖片在實際的工作場景中有時候就是一個小小的問題,就可能引發(fā)出一個大大的bug。而且工作這么多年,看到的線上事故,往往也都是這些小的細節(jié)問題,所以學(xué)習(xí)這些具有實際經(jīng)驗的細節(jié)非常重要。有些事故隱藏的很深!其實很多時候

圖片圖片YsZ28資訊網(wǎng)——每日最新資訊28at.com

在實際的工作場景中有時候就是一個小小的問題,就可能引發(fā)出一個大大的bug。而且工作這么多年,看到的線上事故,往往也都是這些小的細節(jié)問題,所以學(xué)習(xí)這些具有實際經(jīng)驗的細節(jié)非常重要。YsZ28資訊網(wǎng)——每日最新資訊28at.com

有些事故隱藏的很深!YsZ28資訊網(wǎng)——每日最新資訊28at.com

其實很多時候事故也不是一開始就有的,而是隨著需求的迭代,達到某一個條件后觸達到事故的發(fā)生條件了才出現(xiàn)的。就像 MySQL 的時區(qū)配置問題,它既有不同版本 JDBC 連接引擎的不同,又有數(shù)據(jù)庫設(shè)置的時區(qū),還有服務(wù)端設(shè)置的時區(qū),還包括在使用數(shù)據(jù)庫配置時指定的時區(qū)。這些條件綜合發(fā)生時才會出現(xiàn)事故。YsZ28資訊網(wǎng)——每日最新資訊28at.com

接下來,小傅哥就給大家分享下為啥是 8.0.22 版本才會引發(fā)時區(qū)錯誤問題。YsZ28資訊網(wǎng)——每日最新資訊28at.com

一、問題場景

這是一條很普通的SQL語句;YsZ28資訊網(wǎng)——每日最新資訊28at.com

<insert id="insert" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.po.EmployeePO">    INSERT INTO employee(employee_number, employee_name, employee_level, employee_title, create_time, update_time)    VALUES(#{employeeNumber}, #{employeeName}, #{employeeLevel}, #{employeeTitle}, now(), now())</insert>

修改下這條普通的SQL語句;YsZ28資訊網(wǎng)——每日最新資訊28at.com

<insert id="insert" parameterType="cn.bugstack.xfg.dev.tech.infrastructure.po.EmployeePO">    INSERT INTO employee(employee_number, employee_name, employee_level, employee_title, create_time, update_time)    VALUES(#{employeeNumber}, #{employeeName}, #{employeeLevel}, #{employeeTitle}, #{createTime}, now())</insert>

接下來在執(zhí)行插入SQL語句;YsZ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片YsZ28資訊網(wǎng)——每日最新資訊28at.com

  • 原本直接使用數(shù)據(jù)庫語句 now() 的并沒有問題,而改為由程序透傳的時間 createTime 后,日期時間發(fā)生了錯誤。差了8個小時。
  • 通常一般我們操作數(shù)據(jù)庫的時候,寫入的時間,往往都是 now()。但有時候比如要外部透傳用戶下單時間做本系統(tǒng)做一個返利活動,在什么時間內(nèi)才返利,要記錄時間。這個時候發(fā)現(xiàn)寫入數(shù)據(jù)庫的時間就不對了。
  • 因為原本你的系統(tǒng)都是走的數(shù)據(jù)庫時間,現(xiàn)在突然多了一個來自系統(tǒng)的透傳時間,那么你可能是注意不到的。另外由于本機的開發(fā)環(huán)境與服務(wù)器配置不一樣,所以最終直至上線開始跑數(shù)據(jù)了,才發(fā)現(xiàn)問題。這個就是一般出現(xiàn)事故的原因。

二、排查配置

1. mysql jdbc 版本

<dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.22</version></dependency>
  • 8.0.22 版本,官網(wǎng)提示有bug;https://dev.mysql.com/doc/relnotes/connector-j/en/news-8-0-23.html

2. 鏈接參數(shù)配置

jdbc:mysql://127.0.0.1:3306/road-map?useUnicode=true&characterEncoding=utf8&autoRecnotallow=true&zeroDateTimeBehavior=convertToNull&useSSL=true
  • 注意首次沒有配置時區(qū)。配置時區(qū)需要增加參數(shù);&serverTimeznotallow=Asia/Shanghai

3. mysql time-zone 配置

show variables like '%time_zone%';+------------------+--------+| Variable_name    | Value  |+------------------+--------+| system_time_zone | CST    || time_zone        | SYSTEM |+------------------+--------+
  • 命令修改時區(qū);SET time_zone = 'SYSTEM';
  • 命令修改時區(qū);SET time_zone = '+8:00';
  • 注意CST配置,不是中國時區(qū)。默認是美國中部時間。

美國中部時間 Central Standard Time (USA) UTC-05:00 或 UTC-06:00YsZ28資訊網(wǎng)——每日最新資訊28at.com

澳大利亞中部時間 Central Standard Time (Australia) UTC+09:30YsZ28資訊網(wǎng)——每日最新資訊28at.com

中國標準時 China Standard Time UTC+08:00YsZ28資訊網(wǎng)——每日最新資訊28at.com

古巴標準時 Cuba Standard Time UTC-04:00YsZ28資訊網(wǎng)——每日最新資訊28at.com

4. linux 服務(wù)器時間

[root@lavm-aqhgp9nber ~]# timedatectl      Local time: Sat 2024-08-31 13:57:07 CST  Universal time: Sat 2024-08-31 05:57:07 UTC        RTC time: Sat 2024-08-31 05:57:06       Time zone: Asia/Shanghai (CST, +0800)     NTP enabled: yesNTP synchronized: yes RTC in local TZ: no      DST active: n/a

命令修改時區(qū);sudo timedatectl set-timezone Asia/ShanghaiYsZ28資訊網(wǎng)——每日最新資訊28at.com

命令修改時區(qū);sudo timedatectl set-timezone America/New_YorkYsZ28資訊網(wǎng)——每日最新資訊28at.com

三、源碼問題 - MySQL JDBC

1. 8.0.22 版本問題

在 8.0.0 ~ 8.0.22 版本中,如果未配置時區(qū),serverTimeznotallow=Asia/Shanghai 則會取服務(wù)端時區(qū),所以如果服務(wù)端配置的是 CST 時區(qū),則會有問題。調(diào)試源碼;YsZ28資訊網(wǎng)——每日最新資訊28at.com

com.mysql.cj.protocol.a.NativeProtocol#configureTimezoneYsZ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片YsZ28資訊網(wǎng)——每日最新資訊28at.com

  • 在 8.0.22 版本中,獲取時區(qū)的方法,如果本地為配置 jdbc 時區(qū),則會獲取服務(wù)端時區(qū)。也就是 CST 美國中部時間。
  • 所以,如果你要使用的是 8.0.22 就必須指定時區(qū)。jdbc:mysql://IP:13306/road-map?useUnicode=true&characterEncoding=utf8&autoRecnotallow=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimeznotallow=Asia/Shanghai

2. 8.0.23 + 版本

在 8.0.23 版本以后,如果未配置時區(qū),調(diào)整為獲取客戶端時區(qū)。YsZ28資訊網(wǎng)——每日最新資訊28at.com

<dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.23</version></dependency>
  • 切換到 8.0.23 版本。

com.mysql.cj.protocol.a.NativeProtocol#configureTimezoneYsZ28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片YsZ28資訊網(wǎng)——每日最新資訊28at.com

  • 在使用 8.0.23 TimeZone.getDefault() 注釋 Gets the default TimeZone of the Java virtual machine. 獲取 Java 虛擬機默認時區(qū)。這個方法也是 Java 本身代碼的方法。
  • 你可以通過 Java Main 函數(shù)執(zhí)行 System.*out*.println("Default Time Zone: " + TimeZone.getDefault().getID()); 獲取默認時區(qū)。打印結(jié)果為 Default Time Zone: Asia/Shanghai

3. 官網(wǎng)說明

地址:https://dev.mysql.com/doc/relnotes/connector-j/en/news-8-0-23.htmlYsZ28資訊網(wǎng)——每日最新資訊28at.com

Bugs FixedYsZ28資訊網(wǎng)——每日最新資訊28at.com

After upgrading from Connector/J 5.1 to 8.0, the results of saving and then retrieving DATETIME and TIMESTAMP values became different sometimes. It was because while Connector/J 5.1 does not preserve a time instant by default, Connector/J 8.0.22 and earlier tried to do so by converting a timestamp to the server's session time zone before sending its value to the server. In this release, new mechanisms for controlling timezone conversion has been introduced—see Preserving Time Instants for details. Under this new mechanism, the default behavior of Connector/J 5.1 in this respect is preserved by setting the connection property preserveInstants=false. (Bug #30962953, Bug #98695, Bug #30573281, Bug #95644)

從 Connector/J 5.1 升級到 8.0 后,保存和檢索 DATETIME 和 TIMESTAMP 值的結(jié)果有時會有所不同。這是因為,雖然 Connector/J 5.1 默認不保留時間點,但 Connector/J 8.0.22 及更早版本嘗試通過在將時間戳的值發(fā)送到服務(wù)器之前將其轉(zhuǎn)換為服務(wù)器的會話時區(qū)來保留時間點。在此版本中,引入了用于控制時區(qū)轉(zhuǎn)換的新機制 - 有關(guān)詳細信息,請參閱保留時間點。在這種新機制下,通過設(shè)置連接屬性 retainInstants=false 來保留 Connector/J 5.1 在這方面的默認行為。(錯誤 #30962953、錯誤 #98695、錯誤 #30573281、錯誤 #95644)YsZ28資訊網(wǎng)——每日最新資訊28at.com

四、綜上總結(jié)

在使用MySQL的時候,確保服務(wù)器時區(qū)、MySQL時區(qū)、Java應(yīng)用鏈接MySQL JDBC的參數(shù)配置,都指定到具體的時區(qū)上。MySQL JDBC 使用 8.0.23+ 版本,不要使用 8.0.0 ~ 8.0.22 版本,尤其是5.1升級要升級到 8.0.23 以及往后的版本。YsZ28資訊網(wǎng)——每日最新資訊28at.com

正確配置;url: jdbc:mysql://127.0.0.1:3306/road-map?useUnicode=true&characterEncoding=utf8&autoRecnotallow=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimeznotallow=Asia/ShanghaiYsZ28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-112721-0.html是什么導(dǎo)致了,寫入MySQL庫表時間不正確?—— 官網(wǎng)也有Bug!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 什么是內(nèi)存溢出,Golang是如何解決內(nèi)存溢出的

下一篇: 盤點分頁查詢中遇到的坑!

標簽:
  • 熱門焦點
  • 中興AX5400Pro+上手體驗:再升級 雙2.5G網(wǎng)口+USB 3.0這次全都有

    2021年11月的時候,中興先后發(fā)布了兩款路由器產(chǎn)品,中興AX5400和中興AX5400 Pro,從產(chǎn)品命名上就不難看出這是隸屬于同一系列的,但在外觀設(shè)計上這兩款產(chǎn)品可以說是完全沒一點關(guān)系
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發(fā)布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發(fā)布,本次就這款耳機新品給大家?guī)硪粋€簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產(chǎn)
  • 容量越大越不壞?24萬塊硬盤故障率報告公布 這些產(chǎn)品零故障

    8月5日消息,云存儲服務(wù)商Backblaze發(fā)布了最新的硬盤故障率報告,年故障率有所上升。Backblaze發(fā)布的硬盤季度統(tǒng)計數(shù)據(jù),其中包括故障率等重要方面。這些結(jié)
  • 把LangChain跑起來的三個方法

    使用LangChain開發(fā)LLM應(yīng)用時,需要機器進行GLM部署,好多同學(xué)第一步就被勸退了,那么如何繞過這個步驟先學(xué)習(xí)LLM模型的應(yīng)用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 一年經(jīng)驗在二線城市面試后端的經(jīng)驗分享

    忠告這篇文章只適合2年內(nèi)工作經(jīng)驗、甚至沒有工作經(jīng)驗的朋友閱讀。如果你是2年以上工作經(jīng)驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內(nèi)容來自 「升職加薪」星球星友 的投稿,坐
  • 之家push系統(tǒng)迭代之路

    前言在這個信息爆炸的互聯(lián)網(wǎng)時代,能夠及時準確獲取信息是當(dāng)今社會要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動拉"獲取信息的方式已不能滿足用
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個小小的重要功能可以大大改善您網(wǎng)站的用戶體驗
  • 到手價3099元起!iQOO Neo8 Pro今日首銷:安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發(fā)布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
  • 2299元起!iQOO Pad開啟預(yù)售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
Top