日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

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

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

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

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

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

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

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

一、問(wèn)題場(chǎng)景

這是一條很普通的SQL語(yǔ)句;pjF28資訊網(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語(yǔ)句;pjF28資訊網(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>

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

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

  • 原本直接使用數(shù)據(jù)庫(kù)語(yǔ)句 now() 的并沒(méi)有問(wèn)題,而改為由程序透?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è)來(lái)自系統(tǒng)的透?jìng)鲿r(shí)間,那么你可能是注意不到的。另外由于本機(jī)的開(kāi)發(fā)環(huán)境與服務(wù)器配置不一樣,所以最終直至上線開(kāi)始跑數(shù)據(jù)了,才發(fā)現(xiàn)問(wè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
  • 注意首次沒(méi)有配置時(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:00pjF28資訊網(wǎng)——每日最新資訊28at.com

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

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

古巴標(biāo)準(zhǔn)時(shí) Cuba Standard Time UTC-04:00pjF28資訊網(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/ShanghaipjF28資訊網(wǎng)——每日最新資訊28at.com

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

三、源碼問(wèn)題 - MySQL JDBC

1. 8.0.22 版本問(wèn)題

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

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

圖片圖片pjF28資訊網(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ū)。pjF28資訊網(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#configureTimezonepjF28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片pjF28資訊網(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 本身代碼的方法。
  • 你可以通過(guò) 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)說(shuō)明

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

Bugs FixedpjF28資訊網(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 及更早版本嘗試通過(guò)在將時(shí)間戳的值發(fā)送到服務(wù)器之前將其轉(zhuǎn)換為服務(wù)器的會(huì)話時(shí)區(qū)來(lái)保留時(shí)間點(diǎn)。在此版本中,引入了用于控制時(shí)區(qū)轉(zhuǎn)換的新機(jī)制 - 有關(guān)詳細(xì)信息,請(qǐng)參閱保留時(shí)間點(diǎn)。在這種新機(jī)制下,通過(guò)設(shè)置連接屬性 retainInstants=false 來(lái)保留 Connector/J 5.1 在這方面的默認(rèn)行為。(錯(cuò)誤 #30962953、錯(cuò)誤 #98695、錯(cuò)誤 #30573281、錯(cuò)誤 #95644)pjF28資訊網(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 以及往后的版本。pjF28資訊網(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/ShanghaipjF28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 紅魔電競(jìng)平板評(píng)測(cè):大屏幕硬實(shí)力

    前言:三年的疫情因?yàn)橐暇W(wǎng)課的原因激活了平板市場(chǎng),如今網(wǎng)課的時(shí)代已經(jīng)過(guò)去,大家的生活都恢復(fù)到了正軌,這也就意味著,真正考驗(yàn)平板電腦生存的環(huán)境來(lái)了。也就是面對(duì)著這種殘酷的
  • 掘力計(jì)劃第 20 期:Flutter 混合開(kāi)發(fā)的混亂之治

    在掘力計(jì)劃系列活動(dòng)第20場(chǎng),《Flutter 開(kāi)發(fā)實(shí)戰(zhàn)詳解》作者,掘金優(yōu)秀作者,Github GSY 系列目負(fù)責(zé)人戀貓的小郭分享了Flutter 混合開(kāi)發(fā)的混亂之治。Flutter 基于自研的 Skia 引擎
  • Automa-通過(guò)連接塊來(lái)自動(dòng)化你的瀏覽器

    1、前言通過(guò)瀏覽器插件可實(shí)現(xiàn)自動(dòng)化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對(duì)于簡(jiǎn)單的業(yè)務(wù)來(lái)說(shuō)可快速實(shí)現(xiàn)自動(dòng)化的上手工作。Selenium IDEKat
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數(shù)據(jù)的地方,是數(shù)據(jù)源的一種,比如大家經(jīng)常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數(shù)據(jù),它既可以保
  • 自動(dòng)化在DevOps中的力量:簡(jiǎn)化軟件開(kāi)發(fā)和交付

    自動(dòng)化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過(guò)自動(dòng)化工具和方法,DevOps團(tuán)隊(duì)可以實(shí)現(xiàn)以下目標(biāo):消除手動(dòng)和重復(fù)性任務(wù)。簡(jiǎn)化流程。在整個(gè)軟件開(kāi)發(fā)生命周期中實(shí)現(xiàn)更
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過(guò)這樣的問(wèn)題:移動(dòng)設(shè)備上有一個(gè)固定元素,當(dāng)激活虛擬鍵盤時(shí),該元素被隱藏在了鍵盤下方?多年來(lái),這一直是 Web 上的默認(rèn)行為,在本文中,我們將探討這個(gè)問(wèn)題、為什么會(huì)發(fā)生
  • iQOO 11S評(píng)測(cè):行業(yè)唯一的200W標(biāo)準(zhǔn)版旗艦

    【Techweb評(píng)測(cè)】去年底,iQOO推出了“電競(jìng)旗艦”iQOO 11系列,作為一款性能強(qiáng)機(jī),該機(jī)不僅全球首發(fā)2K 144Hz E6全感屏,搭載了第二代驍龍8平臺(tái)及144Hz電競(jìng)
  • iQOO Neo8系列今日官宣:首發(fā)天璣9200+ 全球安卓最強(qiáng)芯!

    在昨日舉行的的聯(lián)發(fā)科新一代旗艦芯片天璣9200+的發(fā)布會(huì)上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發(fā)搭載這款當(dāng)前性能最強(qiáng)大的移動(dòng)平臺(tái)
  • iQOO Neo8系列或定檔5月23日:首發(fā)天璣9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列機(jī)型,不僅搭載了天璣9000+,而且是同價(jià)位唯一一款天璣9000+直屏旗艦,一經(jīng)上市便受到了用戶的廣泛關(guān)注。在時(shí)隔半年后,
Top 主站蜘蛛池模板: 贡山| 平昌县| 遵义县| 乐至县| 南木林县| 鲁山县| 方山县| 富宁县| 清水县| 松滋市| 辽阳市| 阳曲县| 宁海县| 曲水县| 芜湖县| 延津县| 电白县| 汶川县| 益阳市| 呼伦贝尔市| 资讯 | 望奎县| 鲜城| 潜江市| 临海市| 绵阳市| 靖江市| 南部县| 修水县| 桓仁| 双峰县| 海宁市| 大关县| 怀集县| 井研县| 山西省| 满洲里市| 邢台市| 三明市| 太康县| 丹阳市|