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