一、简介
大家应该都知道JMeter的玩法其实多种多样,不光能压测主流的HTTP协议,同时也是支持JDBC的压测,但是JDBC压测如何配置?底层又是如何实现的估计大多数测试同学可能还是一头雾水;毕竟大多数测试同学还是对HTTP压测比较熟悉,那么接下来我将一步一步由浅入深的给大家讲解它具体是如何实现的
二、参数介绍
- 根据JMeter官方文档给出若要实现JDBC压测,首先要建立基础的连接配置,需要添加
JDBC Connection Configuration
Variable Name for created pool : 为连接配置设置别名,这个在JDBC Request需要用到这个别名进行配置绑定
Max Number of Connections : 初始化连接池最大连接数,一般设置0,取对应数据库设置好的连接池大小
Max Wait(ms) : 执行SQL最大等待时间
Time Between Eviction Runs(ms) :有空闲的线程数,释放不使用的线程
Auto Commit : 执行SQL是否自动提交
Transaction Isolation : 事务隔离选项,一般设置DEFAULT
Preinit Pool :说白了就是关闭连接池的(一般用默认false),看下图
Init SQL statements sparated by new line : 建立好连接后是否需要执行初始化的SQL(这块一般不用)
Test While Idle :若为true表示对于空闲的连接线程进行连接验证
Soft Min Evictable Idle Time(ms) :设置上面连接验证的时间不能超过该设定值
Database URL : 用户配置的数据库连接地址
JDBC Driver class : 用户选择目标数据源的数据库驱动类型
Username : 连接数据库用户名
Password : 连接数据库密码
Connection Preperties : 连接属性,自己配置的属性打入到配置中(一般用不到)
- 连接配置
JDBC Connection Configuration
配置完成我们只需要配置发出JDBC请求的配置,所以取样器中要添加JDBC Request
Variable Name for created pool : 这个去JDBC Connection Configuration配置好的别名即可
Query Type : 选择你要执行SQL的类型,查询非参数化选择Select Statement ,SQL需要参数化就要用到Prepared Select Statement 否则会报错,对应的删除、修改、插入可以使用Update Statement来实现,参数选择Prepared Update Statement
parameter values :参数化的字段值
parameter types : 对应参数化字段类型
Variable Name : SQL执行结果后的字段值映射(添加Debug Sampler之后就能看到,这个用处意义不大,几乎不用)
Query timeout(s) : 执行查询操作的超时时间
Limit ResultSet : 查询得到的结果集,返回的记录数
Handle ResultSet : 结果集存储数据类型
- 配置完成之后大家可以添加
查看结果数
来看看执行之后的到的返回结果
三、源码实现
- 同样最开始还是执行JMeter engine ,这一层链路在JMeter engine启动原理这篇文章已经讲清楚了
- engine启动完成之后,在
JMeterThread
类中会调用private void executeSamplePackage()
方法来发出请求获取结果集
- 然后进入
JDBCSampler
类执行sample()方法
- 通过上图操作我们知道JDBCSampler中sample()方法就是先建立连接、然后执行SQL请求,那么接下来我们去看看
conn = DataSourceElement.getConnection(getDataSource());
如何建立连接的过程又做了那些事情
- 我们初始化得到
BasicDataSource
对象后,在调用该类getConnection()方法来实现建立连接,BasicDataSource
属于apache commons包下的dbcp2包下的类,感兴趣的可以去apache官网下载研究
7. 执行完JDBC请求之后,会将结果集有封装到SampleResult对象当中,我们又回到之前的操作3,至此整个JDBC请求链路完成