• 0
  • 1
分享
  • Oracle数据库SEQUENCE溢出异常预防测试
  • 恬恬圈 2019-12-26 13:43:36 字数 3080 阅读 1763 收藏 1

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

在创建的初始值为19位,只要超过18位就无法插入数据,报:数字溢出错误,异常信息如下:

at java.lang.Thread.run(Thread.java:662) Caused by:
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could
not get next sequence value; uncategorized SQLException for SQL [select
hibernate_sequence.nextval from dual]; SQL state [99999]; error code [17026];
数字溢出; nested exception is java.sql.SQLException: 数字溢出 at
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at
org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424)
at
org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:407)

创建的SEQUENCE最大值为ORACLE的默认值,ORACLE数据库保存的最大值为 28位数,均为9 。

1.png

问题:

1.ORACLE默认最大SEQUENCE值为28位9,但在19位9的情况下就无法插入数据,报数字溢出;

2.我们数据库中数值过大时都保存的是科学计数法;

3.所有涉及业务表中的ID都是科学计数法;

2.png

4.创建脚本中的SEQUENCE创建语句是否合理?

3.png

1.我们都限制了最大值;

2.有的初始值都不是从1开始的(如:HIBERNATE_SEQUENCE );

3.是否考虑循环;

测试案例:

1.创建SEQUENCE,设置最大值(nomaxvalue);

2.创建SEQUENCE,设置最小值(nominvalue);

3.创建SEQUENCE,不设置最大值(nomaxvalue);

4.创建SEQUENCE,不设置最小值(nominvalue);

5.创建SEQUENCE,设置最大值、设置最小值;

6.创建SEQUENCE,不设置最大值、不设置最小值;

7.创建SEQUENCE,设置序列不重复(nocycle);

8.创建SEQUENCE,设置序列重复(cycle);

9.创建SEQUENCE,设置序列每次增长1(increment by 1);

10.创建SEQUENCE,设置序列每次增长任意值;

11.创建SEQUENCE,设置序列初始值是1(start with 1);

12.创建SEQUENCE,设置序列初始值为任意值;

13.创建SEQUENCE,设置创建的初始值为INTEGER数据类型的上限(2147483648);

14.创建SEQUENCE,设置创建的初始值大于INTEGER数据类型的上限(2147483648);

15.创建SEQUENCE,设置创建的初始值为LONG数据类型的上限(28位9);

16.创建SEQUENCE,设置创建的初始值大于LONG数据类型的上限(28位9);

17.检查已创建SEQUENCE是否限制了最大值;

18.检查已创建SEQUENCE是否初始值都是从1开始的;

19.检查已创建SEQUENCE是否考虑循环;

20.检查所有实体类和JAVA BEAN中的主键和外键是否为Long类型;

21.检查是否存在Long转换成INTEGER或Int,大转小会造成数据错误;

22.检查JSP页面单选或多选传回ACTION的ID或IDS为字符串类型,字符串转换成Long类型的正确方式之一为Long.valueof(ids),而不能把字符串先转换成Int再转成Long;

23.检查局域变量中ID属性的类型不能为int,比如客户表的ID,在代码中经常出现CustInfo custInfo = xxxService.findCustIdByID(int custId) 或者int custId = xxx.getCustId()。这种类型只能通过关键字 Integer 和 int 来筛选;

24.修改了实体类和JAVA BEAN的主键或外键类型,所有引用了该对象该字段的文件都需要重新编译后发布,否则会报对象属性类型不匹配。

系统使用过程中,并且正在做交易的过程中,突然出现系统崩溃,而又不能在分分钟解决此问题,对于客户来说损失较大,对于用户来说不能容忍。现将实际项目中出现的问题分享出来,希对君有益!


版权声明:本文出自51Testing会员投稿,51Testing软件测试网及相关内容提供者拥有内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   填写软件测试行业问卷结果,免费领取两门测试实战课程。链接:http://vote.51testing.com/  小伙伴们都看到Shopee中国区裁员的消息了吗?  近日,东南亚电商巨头Shopee于国内召开全员大会,宣布将启动团队调整并削减部分岗位。  一位Shopee内部员工表示,大会只开了7分钟就结束了,期间只是宣布了要裁员的消息,没有提到具体部门和其他的裁员信息,称后续人事部门将与员工直接一对一私聊处理。  还有员工称,就在大会开完后,自己所在的部门有3个人收到了裁员通知,“他们今天就直接走人了,不过赔偿方案给到了‘N+2’,给够了,大家也没有过多的吐槽。”  对此,Shopee方...
            0 0 852
            分享
          •   微信安全中心今日傍晚发文称,近期有部分用户利用微信社交功能,在朋友圈、微信群发布“闲置小号换零花钱”等租售微信账号的相关内容。  从公告中获悉,网络黑灰产通过租赁、购买等方式获得正常的微信用户账号,进而利用账号实施违法犯罪行为、逃避监管。微信方面表示,针对此类违法行为,在核实确认后将依据国家相关法律法规及《腾讯微信软件许可及服务协议》《微信个人账号使用规范》,根据违规严重程度进行阶梯式处理;对于多次违规者,将加重处罚。  微信安全中心方面称,骗子通常以诸多口径来寻求租号,如:给商家点赞、刷好评、给孩子拉票等,并承诺“不会干扰用户正常生活”“不会用于非法用途”。为了消除受害者的警惕心,有时候...
            0 0 822
            分享
          •   测试用例方法  1.等价类设计测试用例  具体步骤:  1)明确需求  2)划分有效和无效等价类  ·有效等价类:满足需求的  · 无效等价类:不满足需求的     -规则     - 长度     - 类型     - 是否为空     - 是否重复  3)设计测试用例  · 典型应用场景:输入框  2.边界值设计测试用例  定义:是等价类的一种补充,对输入或输出的边界进行测试的一种黑盒测试方法。  上点:边界上的点。  内点:边...
            0 0 1540
            分享
          • 需求评审之后,开发人员一般会开始拆分任务,测试人员需要对新需求进行消化,消化过程最好的产物就是输出对新功能的需求项梳理,并且根据需求项列出测试注意点以及影响模块。这个过程很像去肉剔骨,抽丝剥茧的感觉,也就是掌握到了版本的精髓。需求点的形式有哪些呢?简单来说就是这个版本产品提出的希望实现的很多个功能点,比如:需要给门加一个锁,这就是一个需求点,智能锁还是机械锁,能不能支持反锁,装几个锁,安全性怎么样,可靠性怎么样,这些是根据需求点发散的测试点,这些测试点有一些在文档里有说明,有一些是没有说明的,需要根据用户实际使用场景考虑。很多人又会有这样的疑惑:测试项和需求项之间的区别有哪些呢。不看以下内容,...
            1 1 7922
            分享
          • 北京时间9月7日早间消息,据报道,巴西政府下令,要求苹果停止在该国销售没有电池充电器的iPhone。此外,巴西司法部还对苹果处以1227.5万雷亚尔(约合238万美元)的罚款,并下令停止销售iPhone12及更新机型。对此,苹果表示将上诉,并称这样做能减少浪费,对环境有利。苹果在邮件声明中表示:“苹果会考虑自身所做一切对人和地球的影响。充电器用到了大量的锌和塑料,从包装盒开始就将它剔除能减少200万吨碳排放,相当于每年从公路上移除50万辆汽车。”2020年苹果宣布新iPhone销售时包装盒内不再搭配充电器,一些客户不满,他们认为苹果这样做是为了降低成本,苹果则说全球已经有几十亿USB-A充电器...
            0 0 1301
            分享
      • 51testing软件测试圈微信