在系统实现中,经常需要用到序列号来记录操作执行的顺序或者打印时间戳等。因为序列号等我们只取正值,所以一般都使用无符号数以表示更大的范围。虽然一般的32位或者64位无符号数表示的范围很大,甚至可以确保在系统的生命周期内都不会用完,但是作为一个健壮的系统还是需要考虑无符号数达到最大后,重新归零的溢出问题。
事件背景:
数据库在sequence没有超过INTEGER类型上限时,系统程序代码中那些错误的和无意义的类型转换、实体类和BEAN用INTEGER类型作为主键的情况是不会引起错误的,一旦超过INTEGER类型上限时,这些场景下就会发生ID变成负数的情况,从而发生保存到数据库中的外键是负数或者根据ID查询不到数据继而产生空指针异常!
测试方法:
1. 删除原有HIBERNATE_SEQUENCE
2. 重新创建HIBERNATE_SEQUENCE
CREATE SEQUENCE HIBERNATE_SEQUENCE
INCREMENT BY 1
START WITH 999999999999999999
NOMAXVALUE
NOCYCLE
CACHE 20;
在创建的初始值为18位9的前提下,数据可插入上千条没有问题;
3. 再次重新创建HIBERNATE_SEQUENCE
CREATE SEQUENCE HIBERNATE_SEQUENCE
INCREMENT BY 1