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