Xxl-Job 之 MySQL導(dǎo)致的觸發(fā)時(shí)間誤差一秒
前面介紹,我們重構(gòu)了XXL-JOB,在測(cè)試環(huán)境升級(jí)到新版本一段時(shí)間后,依然發(fā)現(xiàn)很多日記的觸發(fā)時(shí)間是延遲了一秒才觸發(fā)的。但經(jīng)過各種優(yōu)化后手段后,經(jīng)統(tǒng)計(jì)發(fā)現(xiàn),觸發(fā)的耗時(shí)累加起來已經(jīng)不會(huì)超過1秒了,因此,我們懷疑是MySQL時(shí)間差與容器時(shí)間差的問題。
最終發(fā)現(xiàn),是因?yàn)槿沼洷碛|發(fā)時(shí)間字段使用的datetime類型存儲(chǔ),datetime的精度是秒,如果設(shè)置進(jìn)去的時(shí)間值精度小于秒的話,就會(huì)被四舍五入,可能導(dǎo)致數(shù)據(jù)庫(kù)中的值比原始值多了一秒。
以下是官方文檔的介紹:
可以看到,MySQL5.6之后,已經(jīng)支持TIME、DATETIME和TIMESTAMP類型保存精度到微秒,但要求在創(chuàng)建表的時(shí)候,聲明字段類型時(shí),需要給TIME、DATETIME或TIMESTAMP加上fsp,取值范圍為0~6,默認(rèn)值為0。
以下是測(cè)試案例(MySQL5.6.37版本):
- 創(chuàng)建表
CREATE TABLE t1 (dt DATETIME, dt_ms DATETIME(3));
- 插入數(shù)據(jù)
INSERT INTO t1 VALUES ('2021-12-24 10:00:04.50', '2021-12-24 10:00:04.50');
- 查看結(jié)果
解決方案顯而易見,只需要修改日記表觸發(fā)時(shí)間字段的類型由DATETIME改為DATETIME(1)即可。