今天万正勇(Oracle ACE)要到公司来做培训,不能不放下手头的工作去听一下。主要讲的内容是基于性能的设计和sql系能调优,把自己实践结合笔记和大家共享一下。
基于性能的设计主要思路:
1:系统留有可拓展的接口,方便未来拓展功能。--现在面向接口的编程机会成为了JEE5的规范了,有了spring的IOC,我感觉接口在我们的系统中似乎泛滥灾难,当我们全部用面向接口的编程的时候,继承似乎消失了,但是,很多地方应该用继承的确被BIZ层代替了,应该是biz的却成了manager层,任何东西滥用都是会带来系统的不良反应。
2:功能模块化,采用面向服务的架构 -- 其实这就是在讲分离部署的事情,每个模块最好能够有单独的jar,SOA没读过相关的书籍,不误导大家了。
3:系统高度可以定制。
A:采用规则流引擎,实现业务逻辑可配置,可定制。-- 为了防止在一个计算业务中,频繁的操作数据库,我负责的这个模块是采用了规则引擎的,加上oscache的缓存机制,效率的确提高了很多,以后规则改动了,我只需要关注规则事实类(POJO)和drl文件,不用在java代码中搞出N多的判断(欢迎drools的javaer和我交流)。
B:采用工作流引擎,实现业务流程可灵活定义。--当时改造违约模块的时候就碰到这个问题,由于没有使用工作流,每个流程分散在代码中,新的需求不能在老的逻辑上实现,不得不重写代码。如果使用了工作流引擎,其实就是调整一下流程,加上新的几步操作代码就可以完成需求了。
4:系统有成熟的接口和外部交换数据。--目前系统中主要采用http协议和soap协议和外部网元交互,ftp方式和socket的方式也有。感觉我们的系统和新的网元交互数据的时候,每次都在重新实现一样。这个地方有很大的优化空间。
5:选用成熟稳定的技术,技术架构适度前瞻。--这是一句矛盾的统一体,我们用的struts的json框架其实有N多的bug,我们当时只有在别人的基础上反复的修改测试,耗费了不少的资源,前瞻也是要有点代价的。可惜的是我们没有共享代码或者是提供patch给框架的开发者,虽然符合GUN协议,但是不符合程序员道德规范。
6:大批量数据的处理通过存储过程来实现,简单高效。--目前系统设计中把所有的数据处理流程都放到java代码中实现,号称为了方便以后的可维护性,其实可以让DBA根据业务流程适当的写一些存储过程滴。
7:缓存访问结果,提高访问速度,降低资源消耗。--在相同数据对象多次操作数据库的时候,建议使用缓存机制,持久层用oscache和ibatis结合还不错,更多的时候是在manager层缓存数据对象。
8:控制业务需求。--这个体会深刻,当时**模块的不统一的时间选择操作,出了N多的问题,这个完全就是一个带有作弊性质的bug,应该在需求评审的时候就应该拒绝的。
……
还有很多小点的从性能出发的设计,主要是基于数据库层面的,感觉在工作的过程中都会碰到,高手总结出来了,我们虽然遇到了,没有追根溯源和总结,差距就在这里。
基于sql的调优:
1:索引设计的原则(不一一列举了):--当时在日志操作表在500W条记录的时候,基本查询不出来数据,就是我们在where后面的查询条件的数据库字段没有加索引,加上之后,就直接可以很快查询出来了。当然,不能滥用索引。
2:sql的编写原则:这个只有结合实例才有价值,找个时间专门总结一下系统中的这方面的知识。
---------------------------再用分割线-------------------------------------
去年的oracle培训和今年的oracle培训讲的效果差距很大,万正勇和去年的一个讲师A的差别有一点:A还会sqlserver的维护。专注一点,深入一点,慢慢的就有了质变。