采用铺底数据进行 SOA 应用的性能测试(2)

上一篇 / 下一篇  2008-05-12 16:55:26

2. 高性能准备铺底数据

以上介绍了铺底数据的重要性。要知道准备的铺底数据每张表要上亿条,那么我们如何快速而真实的准备铺底数据呢?这章将详细展开讲解。

2.1. 如果用简单的 JDBC 程序插入铺底数据 , 性能很差

用 JDBC 写一个程序往数据库里面插入数据的话,速度会很慢,大概是十万条一张表需要 20 分钟。那假设我们需要准备 1 亿条数据一张表就是10000/10*20/60=333 小时,如果业务逻辑需要准备 20 张表,那我们准备这些数据将需要333*20=6660 小时 =277.5 天!这样的速度慢得惊人,所以通过 JDBC 准备铺底数据将不成立。

2.2. 高效率生成铺底数据

显然,我们需要能更高效产生铺底数据的方法。笔者所在团队选择了如下的方法:找出数据库之间的表结构关系,并据此把数据翻倍利用 CPU 的运算能力高效率生成的数据导入到数据库中,从而在数据库中产生出所需的铺底数据。通过这种方式即避免了采用编写 JDBC 程序的方式,又能高效地生成铺底数据。

2.2.1. 找到数据库之间的表结构关系

要准备铺底数据首先要找表与表之间的关系,也就是要清楚在数据库里面的表之间的主表附表关系:一对多,多对多的关系。还有要知道实际情况中,一张主表的一条记录大概对应附表的几条数据。只需要一个大概的规律就可以了,或者取一个中间值的比例。我们可以通过 Rational Data Architect 生成的表结构图找到表与表之间的关系:

如下图所示:

ITPUB个人空间)xr5Zm^R ^ m]5}
图 1. 找到表与表之间的关系
z`J$i$Igp0找到表与表之间的关系
L Z9oNrf0ZQ0

从上图(注:上图可以在需求文档中得到)可以看出里面的 7 张表A_S_HISA_STA_IAA_TA_SA_S_T中,我们先要导入的三张表:A_STA_TA_S_T,其次要导的表是A,最后要导入的三张表是A_S_HISA_IA_S。顺便说一下,我们还要保证后导入的表的引自先前导入表的主键须和主表的引它作为外健的条目有对应关系,最好是保持一致。

2.2.2. 准备原始的第一套数据 ( 每张表大概 1000 条数据 ).

首先利用 Rational Performance Tester 7.0 录制一个脚本。脚本里面要包括要测试的主要用例。譬如:笔者所做的脚本一共包括十个请求,要全部按照顺序录入到 RPT 中。

然后,重新建立数据库,使数据库里面不存在数据。

接下来,就可以利用上文录制好的 Rational Performance Tester 脚本循环 1000 次。这样我们的数据库里面的一些表里就会有 1000 条数据了。然后我们从数据库里面查看哪些表中的数据增加了,然后把这些表里面的数据导出到文本文件里。

如图所示:

ITPUB个人空间knw+r9yx c"B
图 2. 把这些表里面的数据导出到文本文件里
{(R[n1Nk u G(GVnk%c0把这些表里面的数据导出到文本文件里
8d/E.\J-O0

注意:对于每张变化的表,我们都要导出它所对应的文本文件。例如:表 casee 对应的文本文件是 casee.sql。

2.2.3. 程序扩大数据至每张表千万条 .

编写程序把每张表对应的文本文件 ( 例如:casee.sql) 的数据成比例扩大 10000 倍,要注意处理表里面的主键的唯一性还有依赖性,保证表和表的一对一关系和一对多关系。首先我们利用db2找到个表的依赖关系:

ITPUB个人空间;j?:ftR5V`Si%E
图 3. 利用 DB2 找到个表的依赖关系ITPUB个人空间KR5E.e1_|+rD J
利用 DB2 找到个表的依赖关系
+zl.H&T~S/i1Q j2^0

从上图中我们可以看到表 CASEE 和很多表都有关系,也就是说它的一些字段在图里面的很多表里面或者做主键,或者做外键。如果 CASEE 里面的字段是图中所示表里面字段的外键,那就需要一一对应了。在程序设计的时候就要保证这两张表的字段和字段里面的值保持一致。

接下来就是写一个程序去把每张表的数据翻倍,笔者在此提供一套思路供大家参考:

  • 我们找到需要表的主键字段以后,让这个字段的数据不要重复,通常都是用数字表示的。建议从 10000000 开始增加,这样可以避免铺底数据和我们的实际数据主键重复。
  • 生成数据的时候要用BufferedReaderBufferedWriter去读写文件。
  • 生成的数据一定要保持主键唯一,还要满足字段的各种约束,否则会导致数据导入后无法active

2.2.4. 把数据导入到数据库中

将数据IMPORTdb2里面,注意不要用load,因为load需要数据之间有约束关系,这样效率会低很多倍。而 IMPORT 不需要依赖关系,因为数据在数据库里面还没有被active

如下所示:


gw2z5~+u2Z{] w0图 4. 把数据导入到数据库中ITPUB个人空间3oKV:Z+Y0t0|to
把数据导入到数据库中ITPUB个人空间(q#z5m.ZX

2.2.5. 将数据库的表置成 ACTIVITY

建好的数据库,需要把表ACTIVITY,并且REORG一次数据库里面的数据。这样使得数据库的查询路径可以优化。

如下所示:


'V-P,z2K6B!FT0图 5. 将数据库的表置成 ACTIVITY
P(gFNP2G4z0将数据库的表置成 ACTIVITY
0FD#[G*X0

2.2.6. 重建表的索引

为数据库里面的表建立一些适当的索引,并且要调整一些数据库的参数,如缓冲池,连接池等。

到此为止,铺底数据就准备好了。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-08-30  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 18574
  • 日志数: 2724
  • 图片数: 1
  • 建立时间: 2008-03-20
  • 更新时间: 2008-08-27

RSS订阅

Open Toolbar