收藏 分享(赏)

软件研发管理-高风险场景(代码)解析-白冰-v1.3.pptx

上传人:weiwoduzun 文档编号:5229454 上传时间:2019-02-13 格式:PPTX 页数:45 大小:1.45MB
下载 相关 举报
软件研发管理-高风险场景(代码)解析-白冰-v1.3.pptx_第1页
第1页 / 共45页
软件研发管理-高风险场景(代码)解析-白冰-v1.3.pptx_第2页
第2页 / 共45页
软件研发管理-高风险场景(代码)解析-白冰-v1.3.pptx_第3页
第3页 / 共45页
软件研发管理-高风险场景(代码)解析-白冰-v1.3.pptx_第4页
第4页 / 共45页
软件研发管理-高风险场景(代码)解析-白冰-v1.3.pptx_第5页
第5页 / 共45页
点击查看更多>>
资源描述

1、软件研发管理 -高风险场景(代码)解析 V1.3,白冰 Mail: QQ:14333092 2012年9月 欢迎大家沟通交流,一、软件研发、交付环节暴露的问题 二、质量事故参观 三、常见高风险场景(代码) 四、案例解析,目录,一、软件研发、交付环节遇到的问题,需求传递失真,非功能性需求被忽略,需求管理,开发,分析设计,测试,实施运维,版本交付节奏失控,软件需求管理,单元测试缺失,集成测试,用户验收测试,问题管理与修正随意,版本发布失控,持续版本升级,版本持续集成,个性化需求,需求变更,分阶段上线,客户,供应商,软件版本无规划,单元测试覆盖度低,参考架构、参考设计缺失,白盒测试能力不足,系统测试

2、不充分,一、软件研发、交付环节暴露的问题 二、质量事故参观 三、常见高风险场景(代码) 四、案例解析,目录,我测试过我的程序吗?,bumblebee is Optimus support for Linux, with real offloading, and not switchable graphics More important it works on Optimus Laptops without a graphical multiplexer,bumblebee是一个开源项目,这个项目是这样介绍自己的:,Optimus 是NVIDIA的“优驰”技术,其可以将您的笔记本电脑PC提升到

3、绝佳状态,提供出色的图形性能,并在需要时延长电池续航时间。这个项目是把这个技术移到Linux上来。,我测试过我的程序吗?,rm rf 表示删除文件,而且可以删除非空目录。-rf参数表示递归强制删除。,说明,bumblebee你真的红了,一个空格引发的惨案,我判断边界条件了吗?,7,BEA WebLogic,数据库内存慢慢耗尽,直至宕机不知道什么时候开始消耗不知道什么时候会宕机不知道什么原因,我判断边界条件了吗?,8,Dump file /oracle/app/oracle/admin/fin/udump/fin_ora_827540.trc Oracle9i Enterprise Editio

4、n Release 9.2.0.8.0 - 64bit Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.8.0 - Production ORACLE_HOME = /oracle/app/oracle/product/9.2.0 System name: AIX Instance name: fin Redo thread mounted by this instance: 1 * 2006-11-23 11:26:04.575 *START PLSQL R

5、UNTIME DUMP* *Got ORA-3113 while running PLSQL* PROCEDURE FINPX.P_GZ_PLZZ_QX: library unit=7000001e219f2c0 line=100 opcode=15 static link=0 scope=0 FP=110297be8 PC=7000001e21a07ba Page=0 AP=110297908 ST=110298638 DL0=110613ff8 GF=1106140a0 DL1=110614040 DPF=110614090 DS=7000001e21a0948DON library un

6、it variable list instantiation .,异常进程正在执行得存储过程为: BEGINp_gz_plzz_qx (:1, :2, :3, :4, :5, :6); END;,fin_ora_385116.trc,fin_ora_352454.trc,我判断边界条件了吗?,9,CREATE OR REPLACE PROCEDURE P_GZ_PLZZ_QX /*- Procedure Name:P_GZ_PLZZ_QX(取消指定工资表已经生成的转账凭证) */ ( al_pzzc IN LONG, -凭证行号串,用“|“间隔,并以“|“结尾.如“20030101|20030

7、102|“) IS BEGINavc_cwdm := 0; - 默认为无错误an_cgs := 0; -默认成功数为0-分解凭证行号到字符串数组中去,并对每一张凭证处理li_zfccd := LENGTH( al_pzzc );li_qswz := 1;li_czwz := INSTRB(al_pzzc,|,li_qswz,1);li_jsq := 1;LOOPEXIT WHEN li_qswz = li_zfccd;lvc_cwhdm := P_GZ_PLZZ_QX01;-调用过程传入参数出错!IF li_qswz = li_czwz THEN lz_hhsz(li_jsq) := -1;E

8、ND LOOP EXCEPTION END;,-判断行号串是否为空,若为空则返回,提示传递参数错误 IF (al_pzzc IS NULL) OR (LENGTH( al_pzzc )=0) THENavc_cwdm :=1;avc_cwms :=凭证字串参数传递错误!;RAISE_APPLICATION_ERROR(-20000,凭证字串参数传递错误!,TRUE); END IF;,我判断边界条件了吗?,10,数据库环境:Oracle 10g ,DB2 8.2/9.7,我判断边界条件了吗?,11,数据库环境:Oracle 10g,我判断边界条件了吗?,12,数据库环境:Oracle 10g,

9、我判断边界条件了吗?,13,借助伪表,进行表达式验证,DB2 8.2,ORACLE 10g,SELECT , , length( ) , length() FROM sysibm.sysdummy1,SELECT , , NULL , length( ) , length() FROM sysibm.sysdummy1,DB2 9.7,SELECT , NULL , length( ) , length() , length(NULL) FROM dual,注意:谨慎处理NULL,对可能为NULL的参数、变量提前预判,JDBC,SELECT length(NULL) FROM sysibm.s

10、ysdummy1,SELECT length(NULL) FROM sysibm.sysdummy1,?,?,(ERROR),(ERROR),我了解数据库的日志原理吗?,财务接口-获取实际执行数据,14,大事务的风险,我了解数据库的日志原理吗?, -清楚明细账数据 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; -重新

11、获取清楚末级科目总账数据 INSERT INTO T_NC_GL_BALANCE_END SELECT * FROM V_NC_GL_BALANCE; COMMIT; ,15,大事务的风险,财务接口-获取实际执行数据,记录数: 200-600万行,数据库环境:DB2,我了解数据库的日志原理吗?,16,INSERT 过程,客户端,服务器,Insert into ,Data Pages,决定数据所要存储的页面,是否已 有页?,分新页,Y,读磁盘页,N,BufferPool,数据,Log Buffer,Row X Locks,Triggers,Commit/Rollback,数据库环境:DB2,1,

12、2,3,4,Log files,-重新获取明细账数据 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;,SMS/DMS 的差别,Tables (Data),Indexes,存储,RAM,Log Buffer is Full or Commit is issued.,Index Pages,1.异步页清除(asynchronous page cleaning),

13、我了解数据库的日志原理吗?,提交(Commit)提交迫使将日志记录写到磁盘上,以保证提交的插入肯定会存在于数据库中,并且释放新行上的锁。这些都是有价值的活动,但是因为 Commit 总是要牵涉到同步 I/O(对于日志),而 insert 则不会,所以 Commit 的开销很容易高于 insert 的开销。建议大约每1000行提交一次:当每1000行而不是一两行提交一次时,性能可以提高大概10倍。不过,一次提交多于 1000 行只能节省少量的时间,但是一旦出现失败,恢复起来所花的时间要更多。,17,我了解数据库的日志原理吗?,减少日志记录性能开销通过使用更大的 LOGBUFSZ 可以获得大约 1

14、3% 的性能提升。风险和问题:紧急事故恢复所花的时间可能要稍微长一点。减少日志写的另一种可能性是对新行要插入到的那个表使用“ALTER TABLE ACTIVATE NOT LOGGED INITIALLY”(NLI)。如果这样做了,那么在该工作单元内不会记录任何 insert 操作。风险和问题:1)如果有一条语句失败,那么这个表将被标记为不可访问的,并且需要被删除掉,这与其他恢复问题一起使得 NLI 在很多情况下不能成为可行的方法;2)在工作单元最后进行的提交,必须等到在此工作单元内涉及的所有脏页都被写到磁盘之后才能完成。这意味着这种提交要占用大量的时间。如果没有积极地进行页清除,那么在使用

15、 NLI 的情况下,Insert 加上提交所耗费的总时间要更长一些。,18,我了解数据库的日志原理吗?,数据库日志 记录所有数据库对象及数据的修改,DB2 V7.1版日志最大32GB 所有改变的数据写到磁盘之前都先写到内存中日志缓冲区(log buffer)里 日志可以写在裸设备上日志的用途 Rollback(回滚) 意外恢复(包括两个阶段) 1) 重做所有事务(不管是否提交) 2) 撤销所有没有提交的修改 前滚恢复(Roll Forward Recovery),19,数据库环境:DB2,我了解数据库的日志原理吗?,写入日志文件的信息 SQL语句 所有改变的数据 Delete操作时将整行记录写

16、入 Update操作会把两个更新的最远的列之间的记录写入到log commits / rollbacks,20,数据库环境:DB2,我了解数据库的日志原理吗?,SECONDARY,PRIMARY,“n”,1,2,3,1,“n”,循环日志(circle logging) 默认的日志方式 主日志文件记录所有修改;事务提交后重用 辅日志文件在主日志文件不够时创建 支持意外恢复/版本恢复,不支持前滚恢复 日志满或者磁盘空间不足时整个事务回滚,归档日志(Archival Logging/Log Retain) LOGRETAIN参数设为ON 日志文件不会删除. 将日志文件备份到二级磁带等二级存储上 支持

17、前滚恢复及在线备份,logprimary logsecond 128(DB2 UDB V7.2),256(DB2 UDB V8.1),数据库环境:DB2,我了解数据库的日志原理吗?,Log files,Tables(Data),Indexes,EMPLOYEE_TEST,1,1,Step 1:Insert;42000rows inserted in 1.95 secs.,Step 2:Delete;-1 rows deleted because of ERROR。SQL0964C 数据库的事务日志已满。 SQLSTATE=57011,Step 3:Exit, then Delete;42000

18、 rows deleted in 2.12 secs.,Data : 3.7M bytes Index: 1.3M bytes Log : 12M bytes,Log : 1620M bytes,DB2数据库参数,Tables,数据库环境:DB2 9.7,评估磁盘存储(I/O)评估数据记录的存储空间(包括索引)评估事务的日志存储空间操作插入42,000 行记录删除42,000 行记录,DML语句事务实例,我了解数据库的日志原理吗?,Step 1:Insert;42000rows inserted in 1.95 secs.,Step 2:Delete;-1 rows deleted becau

19、se of ERROR。SQL0964C 数据库的事务日志已满。 SQLSTATE=57011,Step 3:Exit, then Delete;42000 rows deleted in 2.12 secs.,Data : 3.7M bytes Index: 1.3M bytes Log : 12M bytes,Log : 1620M bytes,数据库环境:DB2 9.7,评估磁盘存储(I/O)评估数据记录的存储空间(包括索引)评估事务的日志存储空间操作插入42,000 行记录删除42,000 行记录,DML语句事务实例,Log files,Tables(Data),Indexes,为什么

20、两次执行结果不同?,一个DB共享log,Log filesize:4M Primary + Second : 3 + 2 如果delete需要写log:18M,!,3+1820,已有3M被其他事务占用,无占用,ok,18M wrote,静态对象缓存技术,24,现象:系统约1个月宕机一次,观测:因为是静态对象,JVM的GC不会将HashMap中的对象进行释放,结合观测的手工heapdump大小,每天以60m左右的进度泄漏内存,能够支撑18-20个工作日(跟系统使用的频度相关,用户多,支撑时间会缩短),即会导致内存溢出,系统无法响应。,静态对象缓存技术,25,public class CheckC

21、lassFactory private static Map checkClassMap = new HashMap(); public static AlertCheck getInstance(String alertCheckName) AlertCheck alertCheck = null; if(alertCheckName!=null ,HashMap.put(Key,Object),我的语法正确吗?有歧义风险吗?,接口表数据类型不一致,同一程序版本,同一表中同一字符型字段的长度在A,B二个地市不一致,其他系统通过触发器给该字段赋值,在A地市执行成功,而在B地市执行失败。产生地:

22、XXX省B地市结果:B地市由于触发器传递过来的数值超长,写字段失败,触发器无法正常执行,进而导致作用于该表的应用无法正常使用。,26,013913843364,013913843364,A地市,B地市,(ERROR),驱动版本可能导致的问题,问题:字段类型为YYYYMM格式的结构,结果终端存入了不可预知的其他字段,导致在更新时语句无法执行成功,在正常情况下,数据库执行不成,应该立即做回滚操作,但恰恰由于中间库JDBC驱动版本较低,导致连接池不释放,而造成挂起。结果:导致数据库锁表,影响业务系统的正常应用。,27,一、软件研发、交付环节暴露的问题 二、质量事故参观 三、常见高风险场景(代码) 四

23、、案例解析,目录,三、常见高风险场景(代码)-枚举,1. 条件循环代码:java,存储过程 2. 静态对象与缓存机制 3. java try catch finally ,对象销毁与释放 4. java 内存空间申请:大数据量查询,大数据量导入、导出 5. 大事务(大数据)场景的接口处理 6. 连接池泄漏 7. 锁与并发 8. 复杂SQL:复杂关联查询 、大数据量统计 9. 内存泄漏,系统的故障点在哪儿?,30,DNS查询,建立连接,HTTP,渲染页面,,192.168.1.25,GET /login,HTTP/1.1 200 OK,发送请求,服务器响应,接收数据,预处理,缓存,时间线,浏览器

24、端,应用服务器端,数据库服务器端,接收请求,控制处理,发送数据库请求,数据库响应,数据展现处理,返回请求,受理请求,页面处理,数据组织,返回请求,数据处理,Java : try catch finally,第一种写法:try catch (Exception e) return x;,这个 return x; 语句 不一定能执行的到,如果以下情况: try 块在没发生异常的情况下 内部有return 语句 发生异常 catch() 块里有 return 语句 发生异常 catch() 块里有 throw 语句。,finally 中的 return x; 等语句一定会被执行,不管try 和cat

25、ch() 有什么语句 。,代码运行路径是否符合预期?,第二种写法: try catch (Exception e) finallyreturn x; ,Java : try catch finally,public class test public test() public int getTryCatch() int d=0;int r=0;tryr=0/d;catch (Exception e)r=1;/return r;finallyr= 2;if (r0) return r;r=3;return r;public static void main(String args) test

26、test1 = new test();int result=100;result=test1.getTryCatch();System.out.println(result); ,public class test public test() public int getTryCatch() int d=0;int r=0;tryr=0/d;catch (Exception e)r=1;return r;finallyr= 2;/if (r0) return r;r=3;return r;public static void main(String args) test test1 = new

27、 test();int result=100;result=test1.getTryCatch();System.out.println(result); ,public class test public test() public int getTryCatch() int d=0;int r=0;tryr=0/d;catch (Exception e)r=1;return r;finallyr= 2;if (r0) return r;r=3;return r;public static void main(String args) test test1 = new test();int

28、result=100;result=test1.getTryCatch();System.out.println(result); ,运行结果,:,运行结果,:,2,1,运行结果,:,2,代码运行路径是否符合预期?,重要资源访问,做好善后,public class DBConn private static DBConn dc;private Connection conn = null;private Statement stmt = null;private DBConn() public static DBConn instance() if (dc = null) dc = new D

29、BConn();return dc;public Statement openStmt() if (stmt = null) conn = getConn();trystmt = conn.createStatement();catch (Exception e) System.err.println(“创建Statement异常: “ + e.getMessage();return stmt;public void closeStmt() if (stmt != null) trystmt.close();catch (Exception e) System.err.println(“Sta

30、tement关闭异常“);if (conn != null) try conn.close();catch (Exception e) System.err.println(“数据库关闭异常“);public Connection getConn() if (conn = null) try ComboPooledDataSource ds = new ComboPooledDataSource();ds.setDriverClass(“com.mysql.jdbc.Driver“);ds.setJdbcUrl(“jdbc:mysql:/localhost:3306/j2ee“);ds.set

31、User(“root“);ds.setPassword(“32147“);ds.setMaxPoolSize(40);ds.setMinPoolSize(2);ds.setMaxStatements(180);conn = ds.getConnection();catch (Exception e)e.printStackTrace();return conn;,异常-程序运行过程中存在的不可预知的可导致执行结果出错的问题,java.lang.Throwable,java.lang.Exception,try catch(Exception ex) finally ,代码运行路径是否符合预期?

32、,Java : try catch finally,连接池泄漏,问题:已分配的Connection未及时释放,回收。或者程序异常导致连接泄漏。导致结果:无法给业务请求分配可用Connection,应用系统无响应。,34,Database,Connection Pool,线程1 (模块1),线程2 (模块2),SQL Client (Servlet/JSP),线程3,DataSource “jdbc/sample”,Connection Object,申请连接,申请连接,释放连接,c1,c2,c3,c4,c5,!,申请连接,连接池泄漏,35,35,Database,Connection Pool

33、,线程1 (模块1),线程2 (模块2),SQL Client (Servlet/JSP),线程3,DataSource “jdbc/sample”,Connection Object,申请连接,申请连接,释放连接,c1,c2,c3,c4,c5,Connection Object Using List (内存实时监控:连接对象被模块的使用状况),Module Execute Log (内存实时监控:模块执行结果;按数据量或定时进行持久化),+Monitor,1.滞留10分钟以上,疑似连接池泄露(或者执行性能低) 2.滞留记录数占连接池最大连接数的60%以上,则有服务无响应风险,1.JavaEE

34、容器初始化连接池,2.模块1/模块2进行联机事务操作(DML/SQL),3.模块2结束事务操作事务操作结束,4.模块4结束事务操作事务操作结束,锁与并发,36,Columns,Table: EMPMDC_P,Data,update EMPMDC_P set div=div+1000 where empno2000; commit;,update EMPMDC_P set div=div+1000 where empno=5500; commit;,Time,Session,U1,U3,锁定列表的最大存储量(4KB) (LOCKLIST) = 50 每个应用程序的锁定百分比列表 (MAXLOCK

35、S) = 22 检查死锁的时间间隔(毫秒) (DLCHKTIME) = 10000锁定超时(秒) (LOCKTIMEOUT) =15,数据库参数,Locks Waiting:1,Locks Waiting:0,可能结果: 1.不受U1影响,U3事务正常完成 2.等待U1事务结束后,U3事务正常完成 3.等待U1事务时间太长,U3事务因死锁或超时而被回滚,数据库环境:DB2,复杂SQL:复杂关联 、大数据量统计,Select a.f1,a.f2,a.f3 From tableName a Where a.f1=YOrder by a.f1,a.f2,37,我的SQL可能消耗DB的哪种资源?,数据

36、读取,内存,磁盘,条件匹配,1.索引匹配 2.表扫描,排序、计算,1.内存计算 (CPU/Mem),Group by a.f1,a.f2,分组计算,1.内存计算 (CPU/Mem),复杂SQL:复杂关联 、大数据量统计,查询必要的数据字段 有效避免全表扫描 使用合适的索引 避免不必要的频繁锁升级,38,绿色SQL,捕获高耗能SQL,39,SELECT 0 ACCOUNTID, 0 COMPANYID, 0 DEPTID, 0 SALESLISTID, 0 CUSTOMERID, A.PRODUCTID, SUM(QUANTSALES) QUANTSALES, B.PRODUCTCODE,B.P

37、RODUCTDESC, cast(NVL(SUM(A.QUANTREAL/d.quantity),0) as decimal(10,2) TRADEPRICE,0 SALESPRICE, cast(NVL(SUM(A.SALESAMOUNT),0) as decimal(10,2) SALESAMOUNT, 0 SALESTAX,cast(NVL(SUM(A.QUANTREAL/d.quantity),0) as decimal(10,2) QUANTREAL,0 AMOUNTTRADESALES,0 DISCAMOUNT,0 TAXRATE,0 INVOICENO, case c.accep

38、tancemodeid when 1 then 电话 when 5 then 预销售 else 其它 end BASEUNIT, 0 INVOICESN,0 ORDERSTATUS,current date SUBMITTIME,current date APPROVALDATE,current date BUSINESSMONTH FROM T_SALES_SALESLISTDETAIL A JOIN T_COMM_PRODUCTCATALOG B ON A.PRODUCTID=B.PRODUCTID join T_COMM_PACKAGESIZEPRICE d on a.productid

39、=d.productid and d.unit=条 join t_comm_company e on panyid=panyid JOIN T_SALES_SALESLIST C ON A.saleslistid = c.saleslistid WHERE 1=2 and 1=2 and panylevel=1 GROUP BY A.PRODUCTID, B.PRODUCTCODE,B.PRODUCTDESC,c.acceptancemodeid ORDER BY QUANTREAL DESC,SALESAMOUNT DESC,b.PRODUCTCODE ASC,复杂SQL:复杂关联 、大数据

40、量统计,绿色SQL,捕获高耗能SQL,Top SQL:我的SQL上榜单了,复杂SQL:复杂关联 、大数据量统计,40,索引是如何提高查询效率的?,0级,1级,2级,B+树是一个系列分层次排列的含有键和指针的节点。一个节点大小等于一个页面大小。,B+树,B+树元素增加,B+树元素查找,B+树元素更新,B+树元素删除,性能的提升,是以存储一定存储空间,降低Insert、Update、Delete的性能为代价的。,复杂SQL:复杂关联 、大数据量统计,like条件:通配符的使用(%)DB函数:通配符的使用(%),41,我的索引是如何失效的?, biz_id like %BM_BUDGET_UNIT3

41、00000000035905827% ,三、常见高风险场景(代码)-规避,系统运行场景了解 代码自查 白盒测试,Jprobe: 1.诊断Java代码中性能瓶颈 2.Memory Debug:发现Java代码中的内存泄漏 3.多线程分析,典型场景: 1.联机事务、分析系统并存:数据加工 2.多用户,并发场景 3.大数据量,事后诊断解决故障的成本 10倍、100倍,一、软件研发、交付环节暴露的问题 二、质量事故参观 三、常见高风险场景(代码) 四、案例解析,目录,四、案例解析,案例1:xx同步调度异常分析-DB2的锁与并发 案例2:静态缓存技术运用失当,导致内存溢出宕机异常,Questions & Answer,Any questions?,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 行业软件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报