当前位置:
文档之家› 软件研发管理-高风险场景(代码)解析-白冰-v1.3
软件研发管理-高风险场景(代码)解析-白冰-v1.3
数据库环境:O
我判断边界条件了吗?
条件表达式 ’’ IS NULL ’’ = NULL ’’ IS ’’ ’’ = ’’ NULL IS NULL NULL = NULL 1 > ’’ 1 > NULL 1 > length(’’) 1 > length(NULL) …
库中,并且释放新行上的锁。这些都是有价值的活动,但是因为 Commit 总是要牵涉到同步 I/O(对于日志),而 insert 则不会,所 以 Commit 的开销很容易高于 insert 的开销。
– 建议大约每1000行提交一次:当每1000行而不是一两行提交一次时,性
能可以提高大概10倍。不过,一次提交多于 1000 行只能节省少量的时 间,但是一旦出现失败,恢复起来所花的时间要更多。
财务接口-获取实际执行数据
„ --清楚明细账数据 DELETE FROM T_NC_GL_DETAIL; COMMIT; --重新获取明细账数据 INSERT INTO T_NC_GL_DETAIL SELECT * FROM V_NC_GL_DETAIL; COMMIT; --清楚末级科目总账数据 DELETE FROM T_NC_GL_BALANCE_END; COMMIT; --重新获取清楚末级科目总账数据 INSERT INTO T_NC_GL_BALANCE_END SELECT * FROM V_NC_GL_BALANCE; COMMIT; „
17
我了解数据库的日志原理吗?
• 减少日志记录性能开销
– 通过使用更大的 LOGBUFSZ 可以获得大约 13% 的性能提升。
风险和问题:紧急事故恢复所花的时间可能要稍微长一点。
– 减少日志写的另一种可能性是对新行要插入到的那个表使用“ALTER
TABLE ACTIVATE NOT LOGGED INITIALLY”(NLI)。如果这样做了,那么 在该工作单元内不会记录任何 insert 操作。 风险和问题:1)如果有一条语句失败,那么这个表将被标记为不可访 问的,并且需要被删除掉,这与其他恢复问题一起使得 NLI 在很多情 况下不能成为可行的方法;2)在工作单元最后进行的提交,必须等到 在此工作单元内涉及的所有脏页都被写到磁盘之后才能完成。这意味着 这种提交要占用大量的时间。如果没有积极地进行页清除,那么在使用 NLI 的情况下,Insert 加上提交所耗费的总时间要更长一些。
数据库环境:Oracle 10g
布尔结果 True False (ERROR) False True False False False False False 语法错误
备注
12
我判断边界条件了吗?
借助伪表,进行表达式验证 JDBC DB2 8.2
SELECT '' , ' ' , length(' ') , length('') FROM sysibm.sysdummy1
我判断边界条件了吗?
运算表达式 length(' ') length('') length(NULL) 1 – '' 1 – NULL '1' – '5' 'A' – 'B' … Oracle 10g 1 (NULL) (NULL) (NULL) (NULL) -4 (ERROR) DB2 8.2 1 0 (ERROR) (ERROR) (ERROR) (ERROR) (ERROR) DB2 9.7 1 0 (ERROR) (ERROR) (ERROR) -4 (ERROR) 强制类型转换 空串 备注 空格字符串
软件研发管理 -高风险场景(代码)解析 V1.3
白冰 Mail:abaibing@ QQ:14333092 2012年9月 欢迎大家沟通交流
目录
一、软件研发、交付环节暴露的问题 二、质量事故参观 三、常见高风险场景(代码) 四、案例解析
一、软件研发、交付环节遇到的问题
供应商 需求管理 分析设计
SELECT length(NULL) FROM sysibm.sysdummy1
?
?
SELECT '' , ' ' , NULL , length(' ') , length('') FROM sysibm.sysdummy1
DB2 9.7
SELECT length(NULL) FROM sysibm.sysdummy1
Optimus 是NVIDIA的“优驰”技术,其可以将您的笔记本电脑PC提升到绝 佳状态,提供出色的图形性能,并在需要时延长电池续航时间。这个项目是 把这个技术移到Linux上来。
我测试过我的程序吗?
bumblebee你真的红了 一个空格引发的惨案
说明 rm –rf 表示删除文件,而且可以删除非空目录。-rf参数表示递归强制删除。
分新页
RAM
SMS/DMS 的差别 Log Buffer Row X Locks BufferPool Triggers Index Pages
Log Buffer is Full or Commit is issued.
1
Insert into …
2
决定数据所要 存储的页面 N
客户端
服务器
是否已 有页?
SELECT '' , NULL , length(' ') , length('') , length(NULL) FROM dual
ORACLE 10g
注意:谨慎处理NULL,对可能为NULL的参数、变量提前预判
13
我了解数据库的日志原理吗?
• 财务接口-获取实际执行数据
大事务的风险
14
我了解数据库的日志原理吗?
18
我了解数据库的日志原理吗?
• 数据库日志 – 记录所有数据库对象及数据的修改,DB2 V7.1版日志最大32GB – 所有改变的数据写到磁盘之前都先写到内存中日志缓冲区(log buffer) 里 – 日志可以写在裸设备上
我判断边界条件了吗?
数据库内存慢慢耗尽,直至宕机 不知道什么时候开始消耗 不知道什么时候会宕机 不知道什么原因
BEA WebLogic
7
我判断边界条件了吗?
异常进程正在执行得存储过程为: BEGIN p_gz_plzz_qx (:1, :2, :3, :4, :5, :6); END; fin_ora_352454.trc fin_ora_385116.trc
8
我判断边界条件了吗?
CREATE OR REPLACE PROCEDURE P_GZ_PLZZ_QX /*--------------------------------------------------------------------------Procedure Name:P_GZ_PLZZ_QX(取消指定工资表已经生成的转账凭证) … */ ( al_pzzc IN LONG, --凭证行号串,用"|"间隔,并以"|"结尾.如"20030101|20030102|“ …) IS … BEGIN --判断行号串是否为空,若为空则返回,提示传递参数错误 avc_cwdm := 0; -- 默认为无错误 IF ((al_pzzc IS NULL) OR (LENGTH( al_pzzc )<=0)) THEN an_cgs := 0; --默认成功数为0 avc_cwdm :='1'; avc_cwms :='凭证字串参数传递错误!'; --分解凭证行号到字符串数组中去,并对每一张凭证处理 RAISE_APPLICATION_ERROR(-20000,'凭证字串参数传递错误!',TRUE); li_zfccd := LENGTH( al_pzzc ); END IF; li_qswz := 1; li_czwz := INSTRB(al_pzzc,'|',li_qswz,1); li_jsq := 1; LOOP EXIT WHEN li_qswz >= li_zfccd; lvc_cwhdm := 'P_GZ_PLZZ_QX01';--调用过程传入参数出错! IF li_qswz = li_czwz THEN lz_hhsz(li_jsq) := -1; … END LOOP … EXCEPTION … 9 END;
数据库环境:Oracle 10g ,DB2 8.2/9.7
10
我判断边界条件了吗?
条件表达式 ’’ IS NULL ’’ = NULL ’’ IS ’’ ’’ = ’’ NULL IS NULL NULL = NULL 1 > ’’ 1 > NULL 1 > length(’’) 1 > length(NULL) …
Y
3
数据
4
Commit/Rollback
读磁盘页
Data Pages
1.异步页清除(asynchronous page cleaning)
存储
Tables (Data) Log files
数据库环境:DB2
Indexes
16
我了解数据库的日志原理吗?
• 提交(Commit)
– 提交迫使将日志记录写到磁盘上,以保证提交的插入肯定会存在于数据
大事务的风险
记录数: 200-600万行
数据库环境:DB2
15
我了解数据库的日志原理吗?
INSERT 过程
--重新获取明细账数据 INSERT INTO ATEST VALUES (1,’10’,’Jet Lee’); INSERT INTO ATEST VALUES (2,’20’,’Jacky Chen ’); INSERT INTO ATEST VALUES (3,’30’,’Jet Lee ABCDEFG „’); COMMIT;