java.lang.RuntimeException: Clock moved backwards. Refusing to generate id for 2590445467 milliseconds。
这个异常通常发生在使用Java的System.currentTimeMillis()
函数来生成ID或在数据库事务中使用时间戳的情况下。当系统时钟被手动或自动(例如,夏令时调整)向后调整时,就会出现这个问题。
这是因为在Java中,System.currentTimeMillis()
返回的是从1970年1月1日00:00:00 UTC开始的毫秒数。如果系统时钟被调整回之前的时间,那么System.currentTimeMillis()
就会返回一个之前已经返回过的值,这就可能导致ID的重复生成或者在数据库事务中出现时间戳混乱的情况。
解决这个问题的方法主要有两种:
- 调整系统时钟:确保你的系统时钟没有被向后调整。如果你在一个需要频繁调整系统时钟的环境中(例如,经常跨越夏令时边界),你可能需要考虑使用一个更稳定的时钟源,或者使用一个不受系统时钟影响的ID生成方法。
- 更改ID生成策略:不要依赖
System.currentTimeMillis()
来生成ID。你可以使用更复杂的ID生成策略,例如UUID,或者使用数据库的自增ID。这些策略都不会受到系统时钟调整的影响。
对于数据库更新失败的问题,可能是因为你在事务中使用了系统时间戳,当系统时钟调整后,时间戳变小,导致数据库认为事务的时间戳不正确,从而拒绝了更新。你可以尝试使用数据库的自增ID或者其他不受系统时钟影响的策略来解决这个问题。
本次解决方案:重启所有服务,单独重启一个未解决