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

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

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

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

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

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

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

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

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

一、問題場(chǎng)景

這是一條很普通的SQL語句;qu028資訊網(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語句;qu028資訊網(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語句;qu028資訊網(wǎng)——每日最新資訊28at.com

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

  • 原本直接使用數(shù)據(jù)庫(kù)語句 now() 的并沒有問題,而改為由程序透?jìng)鞯臅r(shí)間 createTime 后,日期時(shí)間發(fā)生了錯(cuò)誤。差了8個(gè)小時(shí)。
  • 通常一般我們操作數(shù)據(jù)庫(kù)的時(shí)候,寫入的時(shí)間,往往都是 now()。但有時(shí)候比如要外部透?jìng)饔脩粝聠螘r(shí)間做本系統(tǒng)做一個(gè)返利活動(dòng),在什么時(shí)間內(nèi)才返利,要記錄時(shí)間。這個(gè)時(shí)候發(fā)現(xiàn)寫入數(shù)據(jù)庫(kù)的時(shí)間就不對(duì)了。
  • 因?yàn)樵灸愕南到y(tǒng)都是走的數(shù)據(jù)庫(kù)時(shí)間,現(xiàn)在突然多了一個(gè)來自系統(tǒng)的透?jìng)鲿r(shí)間,那么你可能是注意不到的。另外由于本機(jī)的開發(fā)環(huán)境與服務(wù)器配置不一樣,所以最終直至上線開始跑數(shù)據(jù)了,才發(fā)現(xiàn)問題。這個(gè)就是一般出現(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
  • 注意首次沒有配置時(shí)區(qū)。配置時(shí)區(qū)需要增加參數(shù);&serverTimeznotallow=Asia/Shanghai

3. mysql time-zone 配置

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

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

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

中國(guó)標(biāo)準(zhǔn)時(shí) China Standard Time UTC+08:00qu028資訊網(wǎng)——每日最新資訊28at.com

古巴標(biāo)準(zhǔn)時(shí) Cuba Standard Time UTC-04:00qu028資訊網(wǎng)——每日最新資訊28at.com

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

[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

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

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

三、源碼問題 - MySQL JDBC

1. 8.0.22 版本問題

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

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

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

  • 在 8.0.22 版本中,獲取時(shí)區(qū)的方法,如果本地為配置 jdbc 時(shí)區(qū),則會(huì)獲取服務(wù)端時(shí)區(qū)。也就是 CST 美國(guó)中部時(shí)間。
  • 所以,如果你要使用的是 8.0.22 就必須指定時(shí)區(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 版本以后,如果未配置時(shí)區(qū),調(diào)整為獲取客戶端時(shí)區(qū)。qu028資訊網(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#configureTimezonequ028資訊網(wǎng)——每日最新資訊28at.com

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

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

3. 官網(wǎng)說明

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

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

四、綜上總結(jié)

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

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

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

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

下一篇: 盤點(diǎn)分頁查詢中遇到的坑!

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 石頭智能洗地機(jī)A10 Plus體驗(yàn):雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請(qǐng)假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機(jī)A10 Plus。從這個(gè)產(chǎn)品名上就不難看出,這次石頭推出的并不是常見的掃地機(jī)器
  • 帥氣純真少年!日本最帥初中生選美冠軍出爐

    日本第一帥哥初一生選美大賽冠軍現(xiàn)已正式出爐,冠軍是來自千葉縣的宗田悠良。日本一直熱衷于各種選美大賽,從&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 《英雄聯(lián)盟》夏季賽總決賽今日開打!JDG對(duì)陣LNG首發(fā)名單來了 Knight:準(zhǔn)備三連冠

    8月5日消息,今日17:00,《英雄聯(lián)盟》2023LPL夏季賽總決賽將正式開打,由JDG對(duì)陣LNG。對(duì)兩支隊(duì)伍來說,這場(chǎng)比賽不僅要爭(zhēng)奪夏季賽冠軍,更要決定誰才是LPL賽區(qū)一
  • 容量越大越不壞?24萬塊硬盤故障率報(bào)告公布 這些產(chǎn)品零故障

    8月5日消息,云存儲(chǔ)服務(wù)商Backblaze發(fā)布了最新的硬盤故障率報(bào)告,年故障率有所上升。Backblaze發(fā)布的硬盤季度統(tǒng)計(jì)數(shù)據(jù),其中包括故障率等重要方面。這些結(jié)
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優(yōu)化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫(kù),還使用這些庫(kù)實(shí)現(xiàn)了一個(gè)流處理程序
  • 之家push系統(tǒng)迭代之路

    前言在這個(gè)信息爆炸的互聯(lián)網(wǎng)時(shí)代,能夠及時(shí)準(zhǔn)確獲取信息是當(dāng)今社會(huì)要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動(dòng)拉"獲取信息的方式已不能滿足用
  • 自律,給不了Keep自由!

    來源 | 互聯(lián)網(wǎng)品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時(shí)不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺(tái)Keep正式登陸港交所,努力
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級(jí)不香了。俗話說,兵無常勢(shì),水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級(jí)體系并不稀奇。7月13日,淘寶天貓集團(tuán)啟動(dòng)了近年來最大的人力制度改革,目前已形成一
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據(jù)官方此前宣布,三星將于7月26日也就是今天在韓國(guó)首爾舉辦Unpacked活動(dòng),屆時(shí)將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
Top