尝试连接数据库时,Jmeter看不到变量

时间:2015-09-15 20:02:01

标签: jdbc jmeter

我有以下问题。

当您尝试创建连接时找不到变量。 该测试具有以下一系列操作

  1. 下载本地设置文件(放入道具)

  2. 创建一个数据库连接(这种情况发生在不同的组中,我尝试过同样的方式)

  3. 使用下一代码上传本地属性文件(Bean Shell,Thread Group 1)

    FileInputStream is = new FileInputStream(new File("d:/somefolder/somefile.properties"));
    props.load(is);
    is.close();
    

    在创建连接之前,我检查了变量的可用性(Bean Shell,Thread Group 2)

    System.out.println(props.get("db.url"));
    System.out.println(${__P("db.url")});
    ${__setProperty("db.url", props.get("db.url"))};
    System.out.println(${__P("db.url")});
    

    输出

      

    正确连接网址

         

    1(因为函数__P如果变量未定义则返回默认值,   默认值= 1)

         

    正确连接网址

    使用下一个参数(线程组2)创建Jdbc连接

    url:$ {__ P(“db.url”)} 测试失败,因为$ {__ P(“db.url”)}返回1

    如果我使用$ {__ BeanShell(props.get(db.url))} 测试失败,因为props.get(db.url)不返回任何内容

    如果我使用$ {__ javaScript(props.get(db.url))} 测试失败,因为props.get(db.url)不返回任何内容

2 个答案:

答案 0 :(得分:0)

“组件jdbc连接配置”在启动第一个Thread Group之前初始化,因此组件看不到变量,因为他没有初始化。 创建用于连接到db

的脚本
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSetMetaData;

ResultSet clientConfigs = null;
ResultSet gameIds = null;
Connection connect = null;
Statement statement = null;

try {

Class.forName(props.get("configdb.driverClassName"));
String connectionUrl = props.get("configdb.url") + "?user=" + props.get("configdb.username") + "&password=" + props.get("configdb.password");
connect = DriverManager.getConnection(connectionUrl);
statement = connect.createStatement();


clientConfigs = statement.executeQuery("Select keyname,valuestr from client_config WHERE valuestr Like '%/_ah/api/%'");
ResultSetMetaData ccMetaData = clientConfigs.getMetaData();
int clientConfigsColumns = ccMetaData.getColumnCount();
ArrayList clientConfigsList = new ArrayList(20);
while (clientConfigs.next()){
    HashMap clientConfigsRow = new HashMap(clientConfigsColumns);
    for(int i=1; i<=clientConfigsColumns; ++i){           
        clientConfigsRow.put(ccMetaData.getColumnName(i), clientConfigs.getObject(i));
    }
    clientConfigsList.add(clientConfigsRow);
}
vars.putObject("clientConfigs", clientConfigsList);

gameIds = statement.executeQuery("Select gameId from game_config");
ResultSetMetaData giMetaData = gameIds.getMetaData();
int gameIdsColumns = giMetaData.getColumnCount();
ArrayList gameIdsList = new ArrayList(50);
while (gameIds.next()){
    HashMap gameIdsRow = new HashMap(gameIdsColumns);
    for(int i=1; i<=gameIdsColumns; ++i){           
        gameIdsRow.put(giMetaData.getColumnName(i), gameIds.getObject(i));
    }
    gameIdsList.add(gameIdsRow);
}
vars.putObject("gameIds", gameIdsList);
 }
   catch (Exception e) {
  throw e;
  } finally {
  try {
  if (clientConfigs != null) {
    clientConfigs.close();
  }

  if (gameIds != null) {
    gameIds.close();
  }

  if (statement != null) {
    statement.close();
  }

  if (connect != null) {
    connect.close();
  }
  } catch (Exception e) {

}
}

答案 1 :(得分:0)

显然JMeter很早就加载了JDBC配置参数,可能是在UI加载时。请参阅讨论here

  

JDBC Config元素仅在测试启动时处理,因此它是   测试开始后无法更改值 - 即您   无法更改测试计划的不同循环的值。该   测试计划必须知道开始附近的JDBC设置。

这意味着,如果在运行时更改threadGroup-1中的属性值,则更改将不会在JDBC配置中生效。

解决此问题的一种可能方法是在启动JMeter时从命令行设置属性。

或者完全删除JDBC sampler并使用其中一个自定义采样器与JDBC数据源进行交互。