mysql clock,mybatis插入mysql异常 clock moved backwards. Refusing to generate id for XX milliseconds...

记一次坑爹的问题排查

服务器运行时做数据,插入数据时报如下错误

### Error updating database.

Cause: java.lang.RuntimeException: Clock moved backwards.  Refusing

to generate id for 31890658 milliseconds

### Cause: java.lang.RuntimeException:

Clock moved backwards.  Refusing to generate id for 31890658 milliseconds

at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:79)

~[mybatis-spring-1.3.0.jar:1.3.0]

at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447)

~[mybatis-spring-1.3.0.jar:1.3.0]

at com.sun.proxy.$Proxy144.insert(Unknown Source) ~[?:1.8.0]

at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:279)

~[mybatis-spring-1.3.0.jar:1.3.0]

at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)

~[mybatis-3.4.5.jar:3.4.5]

at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)

~[mybatis-3.4.5.jar:3.4.5]

at com.sun.proxy.$Proxy303.insert(Unknown Source) ~[?:1.8.0]

76583110fd1b

【排查过程】

1、clock moved backwards  根据这个关键字百度发现这个是雪花算法的日志,由于服务器时间倒退,雪花算法依赖时间,服务器时间回退6小时,生成id会抛异常

2、看了我的数据表,id是用的 auto_increment  但是历史数据并不是从1开始的,而是19位的数字,进而怀疑是 mybatis的问题

3、查询发现mybatis默认的id生成算法是雪花算法

【结论】

即使数据库层面设置了自增,mybatis的默认算法是2-雪花算法,会用雪花生成id,而不是数据库自增

【解决方案】

主键使用注解设置

@TableId(value="id" ,type=IDType.AUTO)

private Long id;

【反思】

排查花了2小时+,主要耗时原因是自己对mybatis和mysql的不了接,如果提前了解原理,应该会秒解决

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值