记一次坑爹的问题排查
服务器运行时做数据,插入数据时报如下错误
### 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]
【排查过程】
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的不了接,如果提前了解原理,应该会秒解决