【问题标题】:How do you pass in timestamp variable into JDBC request for jmeter如何将时间戳变量传递给 jmeter 的 JDBC 请求
【发布时间】:2023-03-20 12:20:01
【问题描述】:

我正在学习使用 jmeter(第一次)对我们的地理空间 postgres (postgis) 数据库进行一些性能测试。我想使用 JDBC 请求采样器 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 替换情况下执行时间戳变量之后,我认为我可以接受现在只需将时间戳替换为用户定义的变量。

【问题讨论】:

  • 你用的是什么采样器?
  • JDBC 请求采样器。
  • 这样的事情可能会起作用:${__BeanShell(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))}
  • 嗯,beanshell 括号内的内容只是 java 代码,用于以指定格式返回当前日期。 jmeter 中的${__BeanShell()} 指令评估包含的代码,并在运行时用该值替换整个字符串——有点像动态变量替换。 See here for more information。我发表评论是因为我不确定这是否会在 JDBC 采样器的查询框中起作用。
  • 貌似正确的使用方式,是这样的:4.bp.blogspot.com/-rFr8QXtqoyI/T5prpJ09yzI/AAAAAAAAANQ/…查询中的问号和Parameter Values框中的beanshell片

标签: jdbc jmeter postgis


【解决方案1】:

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

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

【讨论】:

  • 我有点希望你能回答,所以我可以给你信用。
【解决方案2】:

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

【讨论】:

  • @MarcelWilson 这是关于“未来”时间戳的,如果您需要当前时间,最好使用 __time() 函数,因为 Beanshell 会导致一些性能开销。
  • 啊,很高兴知道。我将其解释为 __time() 很简单。但正如你所说,在这种情况下,简单更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2021-12-27
  • 2020-11-25
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多