我有以下问题。
当您尝试创建连接时找不到变量。 该测试具有以下一系列操作
下载本地设置文件(放入道具)
创建一个数据库连接(这种情况发生在不同的组中,我尝试过同样的方式)
使用下一代码上传本地属性文件(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)不返回任何内容
答案 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数据源进行交互。