hongsoft

构客网首页  博客  论坛

 
  SOA我有话说
  本文的标签
SDO (收录1536篇)SOA我有话说 (收录167篇)SOA服务构造与实现 (收录36篇)
  用户信息
 
帐号:  新手必读
密码: 保存密码
 
  分类列表
全部类别(199 篇)
我的文章(199 篇)
  按月归档
2004年-0月(62 篇)
2004年-1月(16 篇)
2005年-0月(53 篇)
2005年-1月(6 篇)
2006年-0月(33 篇)
2006年-1月(2 篇)
2007年-0月(12 篇)
2007年-1月(8 篇)
2008年-0月(7 篇)
  SOA2007 - SOA实践
我们何时迈向SOA
——SOA在中国的整体发展现状究竟如何?
我们如何迈向SOA
——中国企业如何迈出实施SOA的第一步?
我们应采用何种技术
——SOA国际标准SCA/SDO的具体内涵?
我们还需要何种技能
——SOA将如何改变系统架构设计以及项目管理过程?

SDO性能优化

发布时间:2007年12月06日 作者:hongsoft

阅读次数:619次 类别:我的文章 永久链接 Trackback 
参加SOA我有话说
SDO性能优化
1       性能分析
1.1   环境
测试机器:192.168.1.181 windows IG内存
数据库机器:192.168.1.61 oracle 10g
公司内网环境。
1.2   分析方法
首先,为了方便春龙的后续工作,采用了CVS的已经有的代码(eos-data-xpath-perftest项目的DASTestCase.java测试类)
其次,为了屏蔽测试机器的CPU波动和网络环境变动所带来的影响,建立了DAS和JDBC两套测试,JDBC方式主要用来作为 选取 有效 测试数据的标准值。
最后,单次测试的值都不可靠,所以每次测试都循环100遍,取100遍的和来进行分析。
1.3   优化前的数据
先看总体情况的数据:(下面的数据都是100次的总和,单位都是纳秒)
测试方法
数据库连接
Criteria转换
执行时间(ps,rs,数据转换)
DAS
273xxx
1xx
xxxx
JDBC
7523 307
 
上表中,从这里我们看到,DAS执行时间比数据库连接多一个数量级,比Criteria转换也多一个数量级。是优化的重点。
 
DAS的执行时间是 100次的总和,包括了 准备PrepareStatement,取ResultSet和 转换成SDO的时间。我们把它分解到每次,在单次中,执行时间的具体分配如下:
准备Criteria
PrepareStatement
取ResultSet
rs->SDO
3xxxx
xxx
368xxxx
314xxxxx
从表中我们可以看到,rs->SDO比 “准备Criteria”多两个数量级,比PrepareStatement多两个数量级,比ResultSet多一个数量级。是优化的重点。
 
 
2       性能优化思路
2.1   优化DataObject.set
RsàSDO调用最多的是 DataObject.set方法,所以首先需要优化它。
我们大部分的情况都是 非openContent的SDO,也都是非Many的属性;但是我们现在的处理方式中,统一考虑了这样的两个特殊情况。
我们的优化思路是:首先考虑 80%的情况,直接处理;不满足再去考虑20%的情况。
所以在set方法中增加如下代码:
int index = ((ExtendedType)type).getPropertyIndex(path);
       if (index >= 0) {//open
           ExtendedProperty property = (ExtendedProperty) getType()
                  .getProperties().get(index);
           if (!property.isMany() && !property.isReadOnly()
                  && property.getType()!=null && property.getType().isDataType()) {//many
              propertyValues[index] = value;
              return;
           }
           setManyNotOpen(index,property, value);
           return;
       }
 
2.2   减少对DataObject的set 和get的调用
调试程序,主要定位对DataObject的set和get的调用,发现如下这些地方比较影响性能,从功能上也只是记录Hibernate的log,可以去掉:
1)  的loadFromResultSet方法是把 某一行ResultSet转成SDO对象的一部分,它会记录当前对象的信息,可以去掉。Loader.java
2)  的getRow方法是把 某一行ResultSet转成SDO对象的另外一部分,可以去掉。Loader.java
2.3   查看其他部分
其他部分都与功能直接相关,不能去掉。
3       性能优化后的数据
用与前面同样的环境,选与前面的JDBC接近的基准数据,优化后的值如下:
先看总体情况的数据:(下面的数据都是100次的总和,单位都是纳秒)
测试方法
数据库连接
Criteria转换
执行时间(ps,rs,数据转换)
DAS
2xxx
122xxx
4xxxxx
JDBC
8517 281
3393 5402 0 (得到rs)
1903 4732 01 (rs->javaBean)
 
在单次中,执行时间的具体分配如下:
准备Criteria
PrepareStatement
取ResultSet
rs->SDO
35xxxx
1xxxx
3xxxxx
22xxxxx
4       总结
Rs->SDO的优化率xxxxx
这个优化率只对 最普通的DAS操作有效,对 openContent和isMany属性没有什么优化。
在最普通的DAS操作情况下,我们基本是做到了 直接 放值和直接取值,可优化的空间已经非常小。
 
执行时间的优化率为 xxxxxxxx
 
这样的优化程度还不够,需要再进行其他方法的优化。

本文参加了“SOA中国的关键任务”博客大赢家,评论文章即可参与活动,赢取万元奖金!

 评论 查看全部评论