用技术创造价值,用艺术塑造自我!
Posts tagged oracle
基于性能的设计和sql调优培训的总结
May 20th
今天万正勇(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的维护。专注一点,深入一点,慢慢的就有了质变。
ORACLE的max函数对number类型的bug
Mar 26th
现象:
根据ibatis日志情况来看,当preReleaseTimes同时存在为空和不为空的数据时,如果按照以下的查询语句执行:
select max(m.preReleaseTimes) from SIMS_CREDITPOINT m,CP_SIMS n
where m.icpCode = n.icpCode
and n.icpType = ‘4′
and t.checkMonth = ‘200804′
and t.typeId = ‘01′
查询的结果为空,此情况在我们32个oracle数据库中,只有2个数据库会存在问题。
如果我们修改一下查询语句,在max中加上to_number:
select max((to_number(m.preReleaseTimes)) from SIMS_CREDITPOINT m,CP_SIMS n
where m.icpCode = n.icpCode
and n.icpType = ‘4′
and t.checkMonth = ‘200804′
and t.typeId = ‘01′
则可以查询出相关的正确结果。
在oracle中number类型的数据可以为空,当空数据和不为空的数据同时存在的时候,使用max函数查询则会偶尔为空。这样的情况不会出现在所有的场合,解决这个问题需要对表统计分析一下。
解决方法:
EXEC Dbms_Stats.gather_table_stats(’数据库用户名,需要全部大写’,'表名,需要大写’);
程序员应该注意的:
在写查询函数的时候,对number类型的max的时候,应该:max(to_number(col)),同时定义number类型的字段的时候尽量让它的初始值0。
oracle的JDBC驱动说明
Mar 27th
Oracle的JDBC驱动一直就是直接拿过来用,却不知道到底有什么具体的作用,今天看到lib目录下面有好几个JDBC驱动,觉得很繁琐,就上网查看了一下,发现的确是在包下面放多了东东,具体的oracle的解释如下:
classes12.jar (1,594,191 bytes) – for use with JDK 1.2 and JDK 1.3
classes12_g.jar (2,038,127 bytes) – same as classes12.jar, except that classes were compiled with “javac -g” and contain some tracing information.
classes12dms.jar (1,601,843 bytes) – same as classes12.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service.
classes12dms_g.jar (2,046,467 bytes) – same as classes12dms.jar except that classes were compiled with “javac -g” and contain some tracing information.
ojdbc14.jar (1,540,457 bytes) – classes for use with JDK 1.4 and 1.5
ojdbc14_g.jar (1,932,834 bytes) – same as ojdbc14.jar, except that classes were compiled with “javac -g” and contain some tracing information.
ojdbc14dms.jar (1,548,006 bytes) – same as ojdbc14.jar, except that it contains additional code`to support Oracle Dynamic Monitoring Service.
ojdbc14dms_g.jar (1,940,478 bytes) – same as ojdbc14dms.jar, except that classes were compiled with “javac -g” and contain some tracing information.
orai18n.jar (1,645,109 bytes) – NLS classes for use with JDK 1.2, 1.3, 1.4, and 1.5. This jar file replaces the old nls_charset jar/zip files.
ons.jar (48,492 bytes) – for use by the pure Java client-side Oracle Notification Services (ONS) deamon.
demo.tar (604,160 bytes) or demo.zip (529,267 bytes) – contains sample JDBC programs.
