JMeter中JDBC Request相关参数的应用

一、数据库驱动类和URL格式 
 
 

Datebase 

Driver class 

Database URL 

MySQL 

com.mysql.jdbc.Driver 

jdbc:mysql://host:port/{dbname} 

PostgreSQL 

org.postgresql.Driver 

jdbc:postgresql:{dbname} 

Oracle 

oracle.jdbc.driver.OracleDriver 

jdbc:oracle:thin:user/pass@//host:port/service 

Ingres (2006) 

ingres.jdbc.IngresDriver 

jdbc:ingres://host:port/db[;attr=value] 

MSSQL 

com.microsoft.sqlserver.jdbc.SQLServerDriver 

或者 

net.sourceforge.jtds.jdbc.Driver 

jdbc:sqlserver://IP:1433;databaseName=DBname 

或者 

jdbc:jtds:sqlserver://localhost:1433/"+"library" 

 

二、相关参数 

1.Variable Name 

其中的Variable Name和上面JDBC Connection Configuration中的Variable Name相同,这里表示JDBC Connection Configuration 建立一个名为pubpool的连接池,之后其他JDBC Request 都共用这个连接池。 

2.SQL Query 

(1)Query Type 

xxx Statement需要填写的sql是一句完整可执行的sql,而Prepared xxx Statement允许用户在sql中使用?,然后在Parameter values和Parameter types中填写参数和类型,最终执行时替代sql中的?,形成一句完整的sql语句。 

Select statement: 

如果SQL语句中需要使用参数变量,那么Query Type 需要设置为Select Statement ,需要先添加Random Variable,然后在Parameter Values中输入${变量名称},${变量名称}; 

在Paramter types中输入变量的数据类型。中间用逗号分隔。 

只能执行第一个SQL语句。 

Update statement: 对于Insert、Update、Delete语句,需要设置Query Type为:Update Statament.数据修改语句中可以使用参数,而且可以顺序执行多个修改语句。 

 

Callable statement: 

##待验证: 

多个查询语句(不使用参数的情况下)可以放在一起顺序执行,需要设置Query Type为Callable Statement,然后顺序输入select语句,不用加go或者分号。如果Query Type设置为:Select Statement的话,只执行第一个SQL语句。 

 

Prepared select statement: 

Prepared update statement: 

Commit: 

把JDBC connection configuration中的自动提交为false,执行更改,增加或删除操作后,查询数据并无更改,再添加一个JDBC Request,设置其Query Type为commit,再次查询,之前的操作生效。 

 

Rollback: 

把JDBC connection configuration中的自动提交为false,执行更改,增加或删除操作后,查询数据并无更改(相当于编辑没保存), 再添加一个JDBC Request,设置其Query Type为rollback(相当于编辑后撤销),再次查询,仍然没有更改。 

如果把JDBC connection configuration中的自动提交为true,执行更改,增加或删除操作后,查询数据更改,但一旦事物被提交就无法rollback。 

Autocommit(false)和Autocommit(true): 

把JDBC connection configuration中的自动提交为true或false,是设置系统参数的默认值。添加一个JDBC Request,设置其Query Type Autocommit为true或false后(相当于修改系统参数),再进行对数据库的增加、删除、修改操作。 

Edit:必须是对上述之一的结果的引用, 为使用正则表达式的操作。 

(2)Parameter values:表示我们要添加的数据,需要不同数据添加可以使用参数化 

   Parameter types为上面需要输入数据的类型,与上面的一一对应 

   Parameter values和Parameter types:成对出现,且sql语句中有多少个?,这里就必须有多少对参数键值对,假设sql语句为select * from ZMYW_USER where ID=?,那么可以设置Parameter values为${id},Parameter types为VARCHAR。 

(3)Variable names:变量名称,为数据库的字段名称,有多个字段返回时,可以使用逗号隔开,用于存放select操作返回的查询结果。 

   Result variable name:用于存放select操作返回的查询结果集。 

3.扩展: 

(1) 当选择了"Prepared select statement"、”Prepared update statement "Callable statement"的类型时,每个连接的语句缓存使用 JDBC 请求。在默认情况下将存储每个连接高达 100 Prepared Statements,这可能会影响您的数据库(打开的游标)。这可以通过定义"jdbc sampler.nullmarker"属性更改。 

(2)在实际的项目中,至少有2种类型的JDBC请求需要关注:select语句和存储过程。前者反应了select语句是否高效,以及表的索引等是否需要优化;后者则是反应存储过程的算法是否高效。它们如果效率低下,必然会带来响应上的不尽如人意。对于这两种请求,JDBC请求的配置略有区别。 

(1)Query Type为Select Statement时,对应执行代码为: 

   stmt = conn.createStatement(); 

   ResultSet rs = null; 

   rs = stmt.executeQuery(sql); 

   return getStringFromResultSet(rs).getBytes(ENCODING); 

(2)Query Type为Callable Statement时,对应执行代码为: 

   CallableStatement cstmt = getCallableStatement(conn); 

   int out[]=setArguments(cstmt); 

   boolean hasResultSet = cstmt.execute(); 

   String sb = resultSetsToString(cstmt,hasResultSet, out); 

   return sb.getBytes(ENCODING); 

(3)Query Type为Update Statement时,对应执行代码为: 

   stmt = conn.createStatement(); 

   stmt.executeUpdate(sql); 

   int updateCount = stmt.getUpdateCount(); 

   String results = updateCount + " updates"; 

   return results.getBytes(ENCODING); 

(4)Query Type为Prepared Select Statement时,对应执行代码为: 

   PreparedStatement pstmt = getPreparedStatement(conn); 

   setArguments(pstmt); 

   ResultSet rs = null; 

   rs = pstmt.executeQuery(); 

   return getStringFromResultSet(rs).getBytes(ENCODING); 

(5)Query Type为Prepared Update Statement时,对应执行代码为: 

   PreparedStatement pstmt = getPreparedStatement(conn); 

   setArguments(pstmt); 

   pstmt.executeUpdate(); 

   String sb = resultSetsToString(pstmt,false,null); 

   return sb.getBytes(ENCODING); 

(6)Query Type为Rollback时,对应执行代码为: 

   conn.rollback(); 

   return ROLLBACK.getBytes(ENCODING); 

(7)Query Type为Commit时,对应执行代码为: 

   conn.commit(); 

   return COMMIT.getBytes(ENCODING); 

(8)Query Type为AutoCommit(false)时,对应执行代码为: 

   conn.setAutoCommit(false); 

   return AUTOCOMMIT_FALSE.getBytes(ENCODING); 

(9)Query Type为AutoCommit(true)时,对应执行代码为: 

   conn.setAutoCommit(true); 

   return AUTOCOMMIT_TRUE.getBytes(ENCODING); 

(10)其它情况直接抛异常:throw new UnsupportedOperationException("Unexpected query type: "+_queryType); 

posted @ 2017-11-28 13:36  春田花花同学会  阅读(1227)  评论(0编辑  收藏  举报