如何将timestamp变量传递给jmeter的JDBC请求

时间:2015-06-08 19:45:56

标签: jdbc jmeter postgis

我正在学习使用jmeter(第一次)对我们的地理空间postgres(postgis)数据库进行一些性能测试。我想使用JDBC Request sampler sql查询来连续命中数据库,但是我需要更改查询中的时间戳,问题是它们不是正常参数,它们在函数调用中的字符串内。

SELECT int_temp_f,
       observed_utc,
       encode(ST_AsBinary(ST_Force_2D("geometry_4326"),'NDR'),'hex') AS geom,
       "ogc_featureid"
FROM fn_surfaceobs_temperature(ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326),
                                NULL,
                                0,
                                'latest',
                                'observed >= ''2015-06-08 14:00:00Z'' AND observed < ''2015-06-09 15:00:00Z'' ',
                                TRUE)
WHERE (geometry_4326 && ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326))
ORDER BY COALESCE(priority,0) DESC, observed DESC;

如何使用jmeter变量替换字符串中的用户定义?

'observed >= ''2015-06-08 14:00:00Z'' AND observed < ''2015-06-09 15:00:00Z'' ',

我想做这样的事情:

'observed >= ''${start_timestamp}'' AND observed < ''${end_timestamp}'' ',

这甚至可能吗?

最终,我想将时间戳更新为“今天”。但是在研究了如何在正常的SQL替换情况下执行timestamp变量后,我认为我现在可以安排将时间戳替换为用户定义的变量。

2 个答案:

答案 0 :(得分:1)

您确实可以在JDBC查询中使用jmeter变量。

SELECT int_temp_f,
       observed_utc,
       encode(ST_AsBinary(ST_Force_2D("geometry_4326"),'NDR'),'hex') AS geom,
       "ogc_featureid"
FROM fn_surfaceobs_temperature(ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326),
    NULL,
    0,
    'latest',
    'observed >= ''${StartDate}'' AND observed < ''${EndDateHour}'' ',
    TRUE)
WHERE (geometry_4326 && ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326))
ORDER BY COALESCE(priority,0) DESC, observed DESC;

这里的技巧是获得有效的时间戳。正如上面指出的RaGe,beanShell就是答案。

您可以创建一个简单的用户指定变量,如下所示:

${__BeanShell(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))}


或者在我的情况下,我需要对时间戳做一些额外的修改,所以我创建了一个beanshell预处理器。 https://stackoverflow.com/a/21847313/2532408有几个解释。

以下是我的意思:

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone;
import java.util.Calendar;

int backhour = -5
int forehour = 1
int foremin = 5

Date date = new Date();
date.setDate(date.getDate()); 
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");  // needs to be 2015-06-09 15:00:00Z
Calendar c = Calendar.getInstance(); // get Java Calendar instance
c.setTime(date); // set Calendar time to now
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);

c.add(Calendar.HOUR, backhour); // add -X hours
df.setTimeZone(TimeZone.getTimeZone("UTC")); // set the dateformat to use UTC
String startDate = df.format(c.getTime());   //create string of calendar object
vars.put("StartDate",startDate);   // set the jmeter var to StartDate

//set the next var 1 hour ahead
c.add(Calendar.HOUR, forehour); // add 1 hour 
String endDateHour = df.format(c.getTime());  //create string of calendar object
vars.put("EndDateHour",endDateHour);   // set the jmeter var to EndDate
c.add(Calendar.HOUR, -forehour); // minus the hour so we can resuse c

答案 1 :(得分:1)

您可以在SQL查询中使用JMeter的__time()函数,它以SimpleDataFormat模式控制的形式返回当前日期。