事宜背景:

数据库在sequence没有超过INTEGER类型上限时,系统程序代码中那些缺点的和无意义的类型转换、实体类和BEAN用INTEGER类型作为主键的情形是不会引起缺点的,一旦超过INTEGER类型上限时,这些场景下就会发生ID变成负数的情形,从而发生保存到数据库中的外键是负数或者根据ID查询不到数据继而产生空指针非常!

测试方法:

jsp数字过大变成科学计数法值得珍藏的Oracle数据库保护办法Sequence溢出异常预防测试 GraphQL

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.ORACLE默认最大SEQUENCE值为28位9,但在19位9的情形下就无法插入数据,报数字溢出;

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

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

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

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的主键或外键类型,所有引用了该工具该字段的文件都须要重新编译后发布,否则会报工具属性类型不匹配。

系统利用过程中,并且正在经商营业的过程中,溘然涌现系统崩溃,而又不能在分分钟办理此问题,对付客户来说丢失较大,对付用户来说不能容忍。
现将实际项目中涌现的问题分享出来,希对君有益!

请关注+私信回答:“学习”就可以免费拿到软件测试学习资料