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或者其他不受系统时钟影响的策略来解决这个问题。
本次解决方案:重启所有服务,单独重启一个未解决
博客指出在Java生成ID或数据库事务用时间戳时,系统时钟向后调整会致ID重复、时间戳混乱及数据库更新失败。解决方法有调整系统时钟,用稳定时钟源或不受影响的ID生成法;更改ID生成策略,如用UUID或数据库自增ID。还给出重启服务的解决方案。

被折叠的 条评论
为什么被折叠?



