如何在jmeter中从数据库返回值

如何在jmeter中从数据库返回值,jmeter,Jmeter,我试图从MSSQL服务器数据库返回一个值,并将其存储在Jmeter中JSR223计时器脚本内的一个变量中。但是,我在日志中得到以下错误- **警告o.a.j.t.JSR223Timer:脚本未返回值 ** 这是我在脚本中编写的代码- try { def promoName = ${promotionName}; //extracted the value using JSONExtractor log.info("Promotion Name is " + pro

我试图从MSSQL服务器数据库返回一个值,并将其存储在Jmeter中JSR223计时器脚本内的一个变量中。但是,我在日志中得到以下错误-

**警告o.a.j.t.JSR223Timer:脚本未返回值 **

这是我在脚本中编写的代码-

try {
        def promoName = ${promotionName}; //extracted the value using JSONExtractor
        log.info("Promotion Name is " + promoName); //not displaying in the log
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
    Connection con = DriverManager.getConnection("jdbc:sqlserver://ServerIP;databaseName="";integratedSecurity=true","<userId>","<password>");
    String query ="select query";
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
        vars.put("promotionInstanceId", rs.getString(1)); //The query returns an instanceId which i need to store in a variable and use it later
        log.info("Promotion Instance is " + ${promotionInstanceId});            
    }
    conn.close();
    } 
catch (Exception e) {
    e.printStackTrace();
试试看{
def promotionName=${promotionName};//使用JSONExtractor提取值
log.info(“升级名称为”+promoName);//不显示在日志中
Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”).newInstance();
Connection con=DriverManager.getConnection(“jdbc:sqlserver://ServerIP;databaseName=“;integratedSecurity=true”、“”、“”);
String query=“选择查询”;
语句stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(查询);
while(rs.next()){
put(“promotionInstanceId”,rs.getString(1));//查询返回一个instanceId,我需要将其存储在变量中,以后再使用它
log.info(“升级实例为“+${promotionInstanceId}”);
}
康涅狄格州关闭();
} 
捕获(例外e){
e、 printStackTrace();

有谁能帮助我理解我可能出错的地方吗?

您应该使用
vars.get
来获取变量值

vars.put("promotionInstanceId", rs.getString(1)); //The query returns an instanceId which i need to store in a variable and use it later
log.info("Promotion Instance is " +  vars.get("promotionInstanceId"));   
  • 使用计时器的原因是什么?您得到的警告是关于丢失的,因为JSR223计时器用于计算虚拟用户,因此它应该以毫秒为单位将值返回到“sleep”。鉴于您不想引入思考时间,因此改为使用它是有意义的

  • 因为它可能会由于与的冲突而导致脚本错误行为,或者该变量将被缓存,并且将为后续调用返回相同的值

  • 建议使用JMeter的内置组件,并尽可能避免编写脚本。为了提取感兴趣的值并将其存储到JMeter变量中,您可以使用,也就是说,查看文章以了解如何执行SQL语句和处理结果


  • 当我使用JDBC请求时,它起作用了。下一个问题是如何使用BeanShell断言全局存储sql查询的返回值。我尝试使用like-${uuuu setProperty(promotionInstanceId,${promotionInstanceId_1}};但我无法在另一个threadPromotionInstanceId中检索到该值,该值是我在创建jdbc请求时给出的变量名。我重复第2点:不要将JMeter函数或变量内联到脚本中。相关替换为
    props.put(“promotionInstanceId”,vars.get(“promotionInstanceId_1”))我现在的项目设置就像我有2个JSON提取器从HypReQuestRebug数据中提取“ProjtudiID”和“ProjoTestNoX”,从JBCREQUEST中提取“ProjistStimeSnID”。然后在BeaSek断言中,我设置了全局提取的值,这样我就可以使用THO。se值在另一个线程中。我可以设置sql查询值,但json提取器值未设置。原因可能是什么?在BeanShell断言中,我有3行-${uuuuu setProperty(promotionId,${promotionId};//从第一个json提取器中提取${uuuu setProperty(promotionName,${promotionName})};//从第二个JsonExtractor${uuu setProperty(promotionInstanceId,${promotionInstanceId_1})提取;//从JDBCRequest查询提取