You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter Beanshell Sampler执行JDBC请求:遍历结果集打印控制台及响应体为空问题

JMeter Beanshell JDBC 常见问题:空响应与结果集遍历

一、为什么你的JDBC请求响应体为空?

你当前执行的是PL/SQL INSERT操作块,用的是pstmt.executeUpdate()方法——这个方法专门用来执行增删改语句,返回的是受影响的行数,而非结果集(ResultSet)。所以JMeter的响应体为空是完全正常的,因为这个操作本身就不会返回数据。

如果想确认操作是否成功,你可以获取executeUpdate()的返回值,把它打印到JMeter日志或者控制台,修改后的代码片段如下:

import java.sql.*; 
import oracle.jdbc.*; 
import org.apache.jmeter.protocol.jdbc.config.DataSourceElement; 

ResultSet rs = null; 
ResultSetMetaData rsmd = null; 
PreparedStatement pstmt = null; 
Connection conn = null;

try {
    conn = DataSourceElement.getConnection("IMPACTConnectionPrerequisitsII"); 
    String Query = "DECLARE \n" + 
        "j number(4); \n" + 
        "BEGIN \n" + 
        "FOR j in 22 .. 23 LOOP \n" + 
        "INSERT INTO FWA_STAGE_TU \n" + 
        "(ID,EXT_ID,BATCH_NO,OPERATION,BLOCK_ROLL_UP_LAST_RECORD,LAST_UPDATED_DATE,ERROR_FLAG,TRIAL_NO,TRIAL_ALIAS_CODE, \n" + 
        "COUNTRY_CODE,DISPLAY_UNIT_NO,GROUP_NO,TRIAL_UNIT_REFERENCE,PRIMARY_INVESTIGATOR,PRIMARY_CENTRE,LOCATION_NO, \n" + 
        "PURPOSE_CODE,MANAGING_MED_UNIT_CODE,UPDATING_MED_UNIT_CODE,FINANCE_MED_UNIT_CODE,PATIENTS_ALL_SET_UP_FLAG, \n" + 
        "PATIENT_MONITORING_FLAG,COMMENTS,CONFIRMED_FLAG,CONFIRMED_BY,CONFIRMED_DATE,ROLLUP_ROLLDOWN_PLANNED_FIGS, \n" + 
        "DOC_COLLECTION_INDICATOR,VALIDATED_PAT_CAP,MAXIMUM_PAT_CAP,PREFERRED_LANGUAGE_CODE,NEW_DISPLAY_UNIT_NO, \n" + 
        "TOTAL_OPEN_DCF_ISSUES_NO,ORDER_INTERVAL,ORDER_INTERVAL_UNITS,DATA_SOURCE_CODE,RANK_SEQ) \n" + 
        "VALUES (j, 1, 10, 'I', NULL, SYSDATE, 'N', 102922, 'TESTTRIAL4', 'BEL', \n" + 
        "j, NULL, 'BELTU'||j, 130262, 124236, NULL, 'PATTR', 'FP', 'FP', 'FP', 'N', 'Y', 'TESTTU'||j, \n" + 
        "'Y', 999999, SYSDATE, NULL, 'P', 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL); \n" + 
        "END LOOP; \n" + 
        "END;"; 

    pstmt = conn.prepareStatement(Query); 
    int affectedRows = pstmt.executeUpdate();
    // 打印到JMeter日志(可通过右上角日志查看器查看)
    log.info("本次INSERT操作影响了 " + affectedRows + " 行数据");
    // 打印到控制台(JMeter命令行启动时可见)
    System.out.println("本次INSERT操作影响了 " + affectedRows + " 行数据");
} catch(Throwable ex) { 
    log.error("执行JDBC操作出错: ", ex); 
    throw ex; 
} finally { 
    // 关闭资源顺序:ResultSet -> Statement -> Connection
    if (rs != null) { 
        try { rs.close(); } catch(Exception e) { log.warn("关闭ResultSet出错: ", e); }
        log.info("ResultSet已关闭"); 
    } 
    if (pstmt != null) { 
        try { pstmt.close(); } catch(Exception e) { log.warn("关闭PreparedStatement出错: ", e); }
    } 
    if (conn != null) { 
        try { conn.close(); } catch(Exception e) { log.warn("关闭Connection出错: ", e); }
        log.info("数据库连接已关闭"); 
    } 
}

二、如何遍历JDBC结果集并打印到控制台?

只有执行SELECT查询语句(或返回结果集的PL/SQL块)时,才会生成ResultSet。下面给你一个示例,演示执行查询、遍历结果集并打印每一行数据的完整流程:

import java.sql.*; 
import org.apache.jmeter.protocol.jdbc.config.DataSourceElement; 

ResultSet rs = null; 
ResultSetMetaData rsmd = null; 
PreparedStatement pstmt = null; 
Connection conn = null;

try {
    conn = DataSourceElement.getConnection("IMPACTConnectionPrerequisitsII"); 
    // 示例查询:获取刚才插入的FWA_STAGE_TU数据
    String query = "SELECT ID, EXT_ID, TRIAL_ALIAS_CODE, COMMENTS FROM FWA_STAGE_TU WHERE ID BETWEEN 22 AND 23";

    pstmt = conn.prepareStatement(query); 
    // 执行查询获取结果集
    rs = pstmt.executeQuery();
    
    // 获取结果集元数据,用来打印列名
    rsmd = rs.getMetaData();
    int columnCount = rsmd.getColumnCount();
    
    // 打印列名
    System.out.println("查询结果列名:");
    for(int i=1; i<=columnCount; i++){
        System.out.print(rsmd.getColumnName(i) + "\t");
    }
    System.out.println("\n------------------------");
    
    // 遍历结果集,打印每一行数据
    System.out.println("查询结果数据:");
    while(rs.next()){
        for(int i=1; i<=columnCount; i++){
            // 可通过列索引或列名取值,比如rs.getString("ID")
            System.out.print(rs.getString(i) + "\t");
        }
        System.out.println();
    }
    
    // 同时记录到JMeter日志
    log.info("查询完成,共获取到 " + rs.getRow() + " 条数据");
} catch(Throwable ex) { 
    log.error("执行查询出错: ", ex); 
    throw ex; 
} finally { 
    // 按顺序关闭资源避免泄漏
    if (rs != null) { 
        try { rs.close(); } catch(Exception e) { log.warn("关闭ResultSet出错: ", e); }
    } 
    if (pstmt != null) { 
        try { pstmt.close(); } catch(Exception e) { log.warn("关闭PreparedStatement出错: ", e); }
    } 
    if (conn != null) { 
        try { conn.close(); } catch(Exception e) { log.warn("关闭Connection出错: ", e); }
        log.info("数据库连接已关闭"); 
    } 
}

额外提醒:

  • Beanshell在JMeter中已逐步被Groovy替代,Groovy性能更好、语法更简洁,建议优先使用Groovy Sampler执行这类逻辑。
  • 如果想在JMeter响应体中看到结果,可以把遍历的内容拼接成字符串,用vars.put("result", 拼接好的内容)存入变量,再通过Debug Sampler查看。

内容的提问来源于stack exchange,提问作者user16923013

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:22:46