在系统实现中,经常需要用到序列号来记录操作执行的顺序或者打印时间戳等。因为序列号等我们只取正值,所以一般都使用无符号数以表示更大的范围。虽然一般的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;
在创建的初始值为1

本文探讨了Oracle数据库中序列号溢出可能导致的问题,包括ID变为负数、保存错误和空指针异常。介绍了测试方法,如设置不同序列参数并检查其行为,并提出在系统设计中需要注意序列的最大值、初始值以及类型转换,以避免潜在风险。同时,列举了一系列测试案例以确保序列的健壮性。
最低0.47元/天 解锁文章
1万+

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



