您的位置:首页 > 其它

给Super-smack的gen-data程序添加time格式支持

2012-08-27 11:14 411 查看
随着数据库应用的蓬勃发展,越来越多的系统都将数据库作为数据永久存储的重要媒介。随着时间的推移,数据库中的数据量越来越大,数据库逐渐成为了应用的性能瓶颈。如何在开发及后期运营阶段对数据库做合理的优化,成为开发人员和DBA重要的工作内容。数据库压力测试工具也就应运而生。我本人选择的是super-smack 1.3作为数据库的压力测试工具。为什么选择它?因为它可以自定义数据库结构,自定义压力测试语句,配置相当的灵活,只要仔细构造配置文件,就能很好的满足各种压力测试需求。

当然,任何工具都有瑕疵,super-smack也不例外。我目前就遇到了问题,数据库中的日期格式,用super-smack的gen-data工具,无法很好的生成出来。由于没有原生支持,只有想替代方案了。有两个替代方案,一种是直接把日期写在gen-data的--format参数里面,如gen-data -n 100 -f %s,2012-01-01,%d。

但是问题也出来了,如果我要跟时间,中间的空格就会导致后面的列都无法生成,也就是说,只能精确到天,不能精确到秒。这显然不是我想要的结果。因此,就考虑第二种方案,那就是自己动手修改gen-data程序的源代码,添加对time格式的支持。

浏览super-smack 1.3的源代码目录,会发现里面有个src目录,进去之后,就发现了gen-data.cc文件。这个,就是gen-data程序的c++源代码了。好了,动手(记得提前备份原始版本啊,出问题了也还有得救)。

1. 在#include <string.h>下面,添加对time的头文件引用#include <time.h>

2. 找到usage()函数,在d - integer下面新增一行,添加:t - datetime(use system time zone) \n\

3. 在print_str函数后面,编写print_date函数,源代码如下:

void print_date(int min_rand_days, int max_rand_days)

{

time_t rawtime;

struct tm * timeinfo;

time(&rawtime);

int second_per_day = 24*60*60;

int rand_seconds = second_per_day;

min_rand_days = min_rand_days == 0 ? 1 : min_rand_days;

max_rand_days = max_rand_days == 0 ? 1 : max_rand_days;

if((min_rand_days == max_rand_days))

{

rand_seconds = min_rand_days * second_per_day;

rand_seconds -= rand()%second_per_day;

}

else

{

rand_seconds = (rand()%(max_rand_days - min_rand_days) + min_rand_days)*second_per_day;

rand_seconds = rand_seconds == 0 ? second_per_day : rand_seconds;

rand_seconds = rand()%((rand_seconds - min_rand_days*second_per_day)==0?rand_seconds:(rand_seconds - min_rand_days*second_per_day)) + min_rand_days*second_per_day;

}

rawtime = rawtime + rand_seconds;

timeinfo = localtime(&rawtime);

fprintf(out, "%d-%d-%d %d:%d:%d",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);

}

4. 在print_row函数中,在case 'd'和default之间,添加如下代码:

case 't':

print_date(min_width, width);

parse_state = ST_PLAIN;

break;

到了这一步,对源代码的修改工作就完成了,保存文件。

然后就可以开始编译源代码了。编译指令如下:

cd super-smack-1.3

./configure --prefix=/usr/local/supersmack --with-mysql=/usr/local/mysql

make

这里要注意:

第一行命令,是进入super-smack-1.3所在的目录,需要根据你的实际文件目录来决定,不要完全照搬我的命令啊。

第二行命令,configure里面的prefix是make install用的,你可以不用加,如果你后面打算make install,你就加上。路径根据实际情况修改。 --with-mysql这里,根据你的实际情况,选择是oracle,mysql还是其他数据库,详细参考./configure --help。至于后面的路径,是你的数据库安装路径,根据实际情况修改。

make完成之后,如果一切顺利,你就可以获取到修改后的gen-data程序了,拷贝覆盖你的旧程序,就可以搞定了。

下面贴几个我机器上的运行结果:

[root@localhost src]# gen-data --help

gen-data version 1.1

MySQL AB, by Sasha Pachev

Prints lines random data to stdout in given format

Usage: gen-data [options]

-?, --help - this message

-V, --version - show version

-n, --num-rows=num - number of rows

-f, --format=fmt_str - format string

Format can contain any character + % followed by

a format specifier. Valid format specifiers:

s - string

d - integer

t - datetime

Additionally, you can prefix a format speficier with:

n - generate exactly n characters

m-n - generate between m and n characters

===========================================================

[root@localhost src]# gen-data -n 2 -f %t

2012-8-27 3:13:58

2012-8-27 3:13:58

如果要把数据结果放文件里面去,可以用以下命令:

gen-data -n 2 -f %t > /root/test.dat

赶紧试试吧,如果你需要这样的功能的话。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐