美文网首页
16_jmeter多线程共用jdbc request查询出的数据

16_jmeter多线程共用jdbc request查询出的数据

作者: 王康健_0124 | 来源:发表于2019-01-10 15:12 被阅读0次

    15_jmeter用jdbc连接MySQL数据库中介绍了怎么使用jmeter的JDBC request 连接数据库并使用其中的值,但是都是基于同一个线程!在不同的线程中用${变量名_下标}是取不到值的,我们需要做的是先把JDBC读取的参数设置为全局变量,然后在别的线程中就可以访问了!

    一. 在测试计划下添加一个setUp线程组(在Thread Group线程组运行之前运行)

    ① 右键测试计划-->添加-->线程组-->setUp线程组
    ② 如果我们只想这个线程中的请求只运行一遍,setUp线程组中的设置参数就默认不变就好

    二. 在setUp线程组中添加链接数据量的配置(怎么连接数据库就不写了)

    三. 在setUp线程组中创建两个jdbc request 请求,一个是为了查询出数据,一个是为了count一下查询出的数据有多少行(做循环的时候用)

    四. 在setUp线程组下创建一个循环控制器 这个很重要,jdbc request查询出的数据我们要在这里给转换成全局变量!

    五. 在循环控制器中创建一个计数器 和 后置处理器 BeanShell PostProcessor(是右键循环控制器添加的,计数器和后置处理器 BeanShell和中间夹的请求都是平级关系)

    1. 循环次数设置:
      设置为查询出的总行数时设置的变量名+下标 ${CountData_1},保证查询出多少行就转换多少参数

    2. 计数器设置和目的:
      目的:
      ① JDBC取值按下标来取,这样可以保证取到所有查询到的值,且不重复
      ②转换后的值存到一个变量中,也可以加上下标,这样便于后面取值,也不会因为变量名相同存值的时候会新值覆盖旧值
      设置:


    ② BeanShell PostProcessor 中写转换全局变量的函数

    // 查询出JDBC 请求出来的数据
    log.info("----------------------sel_name="+vars.get("sel_name_${id}")+"--------------------");
    
    // 把JDBC请求的数据一条一条转换成全局变量
    ${__setProperty(${__V(Ssel_name_${id})},${__V(sel_name_${id})},)};
    

    详解:

    ${__setProperty(${__V(Ssel_name_${id})},${__V(sel_name_${id})},)};
    分为两个部分:
    第一部分:${__setProperty(转换后全局变量的名称,需要转换的全局变量的名称,)};这是转换全局变量的函数格式
    第二部分:${__V(Ssel_name_${id})}${__V(sel_name_${id})}
    ${__V(Ssel_name_${id})}:这是按下标读取jdbc中变量名中的值
    ${__V(Ssel_name_${id})}:把转换后的值存到一个变量中,变量名生成规则:Ssel_name_加上计数器中读取到的${id}的数字,便于保证变量的唯一性,和取值的简易性

    ③ 请求 全局变量后查询:${__V(${__P(Ssel_name_${id},)})} 为了在结果树中演示转黄成全局变量后的值

    六、添加一个线程组-->debug sampler,名称改为---------------华丽的分割线----------------------

    无意义,只是为了在结果树中起到一个分隔作用,也可以看数据库返回参数值

    七、在测试计划下添加一个计数器,为了实现取全局变量名时的下标的唯一性,如果调用上一个计数器的参数${id},不会从1开始计算,按下标取值时无法从头开始取值

    八、添加三个线程组,每个线程组下添加一个http sampler

    线程组设置:循环两次
    http sampler设置:把http sampler的名称改成:${__V(${__P(Ssel_name_${b},)})}+++++++${b}无意义,只是为了在结果树中看结果

    详解:${__P(Ssel_name_${b},)} 取转换成全局变量名称的格式,、
    ① Ssel_name_:上面BeanShell PostProcessor定义的全局变量名称
    ${b}:测试计划下计数器的取值方式
    +++++++${b}:为了看计数器的取值是几

    九、执行

    分割线上面是jdbc request查询出的所有参数,分割线下别的线程1/2/3的请求名称中打印的全局变量的值,说明多线程共享jdbc的数据成功了

    但是${b}的取值竟然是3开始的,这里说一下jmeter问题,我觉得是bug

    线程组1的前面有两个线程组,“setUp线程组”“---------------华丽的分割线----------------------”
    原因:当第一个调用计数器变量名的线程组前面有几个线程组执行了,那么计数器第一次的取值会自动在原有的基础上在加上线程的数量

    实例:禁用“---------------华丽的分割线----------------------”后,这里可以看见从2开始调用了

    jmeter的bug:当我尝试把“setUp线程组”给禁用后,JDBC Request请求依然成功的执行了

    我不知道这样会不会对压测有影响,没有做检查,所以我把计数器中的起始值改成了从0开始,这样第一个调用的参数就是1了

    相关文章

      网友评论

          本文标题:16_jmeter多线程共用jdbc request查询出的数据

          本文链接:https://www.haomeiwen.com/subject/zfxarqtx.html