| 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
|
|
|
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
|
|
|
35xxxx
|
1xxxx
|
3xxxxx
|
22xxxxx
|
4 总结
这个优化率只对 最普通的DAS操作有效,对 openContent和isMany属性没有什么优化。
在最普通的DAS操作情况下,我们基本是做到了 直接 放值和直接取值,可优化的空间已经非常小。
执行时间的优化率为 xxxxxxxx
这样的优化程度还不够,需要再进行其他方法的优化。 |