一、 前言

最近在公司里做性能测试,对于一张大概400万数据的表,进行全表扫描往往会比较费时,更不要说有若干这样的表格级联进行检索了。为了能够在不影响生产环境的前提下进行SQL的性能优化,需要首先利用测试工具模拟多用户并发的场景进行性能测试,确认有效之后再在生产环境上线。本文主要解决以下几个问题:

  • 没有LoadRunner的授权(太贵了),而且LoadRunner本身对初学者来说也太难了点。
  • 需要优化的SQL查询语句有变量参数,而且需要在并发中处理。
  • 用两种方式(SQL查询方式和HTTP方式)进行性能测试。

二、 测试环境说明

下面首先介绍一下使用SQL方式进行测试的步骤。

三、 准备环境

  • 首先需要有一个可以使用的Oracle数据库环境。
  • 确认你的电脑是否已经安装了JDK,如果没有的话需要先安装一下。
  • 下载Apache JMeter,解压缩之后就可以用了。
  • 下载Oracle Instant Client 12c,解压缩之后,将ojdbc6.jar拷贝到JMeter目录下面的lib子目录下,这个是Oracle数据库的JDBC驱动。

到这里,用于SQL方式测试的环境就已经都搭建好了。

三、 准备测试数据库

1. 创建一个测试用的数据库

CREATE TABLE USER_INFO
(
user_name varchar(255),
address varchar(255),
)

在数据库中插入一些数据。

INSERT INTO USER_INFO(user_name, address) values('张三', '北京')
INSERT INTO USER_INFO(user_name, address) values('李四', '天津')
INSERT INTO USER_INFO(user_name, address) values('王二', '上海')
INSERT INTO USER_INFO(user_name, address) values('大胖', '重庆')
INSERT INTO USER_INFO(user_name, address) values('小黑', '海南')

2. 准备测试用的参数文件。

CSV文件的内容如下:

姓名,地址
张三,北京
李四,天津
王二,上海
大胖,重庆
小黑,海南

3. 在Windows的资源管理器中,进入JMeter的安装目录bin子目录下,运行jmeter.bat,即可打开jmeter的主界面。

4. 设置测试计划

  • 在刚打开JMeter的时候,默认会存在两个节点:测试计划和工作台,点击“测试计划”,在右边的属性页面中,命名为“我的数据库测试计划”。

  • 在“测试计划”属性页的最下面,可以设置jar包所在的路径,这里设置为"D:\apache-jmeter-2.10\lib",这个是我的机器中JMeter的lib目录,在这个例子中,Oracle的jdbc驱动也已经拷贝到该目录下。

5. 创建线程组

  • 右键单击左侧的“我的数据库测试计划”,在弹出菜单中选择:添加->Threads(Users)->线程组,就会创建一个新的线程组。

  • 在右侧的属性界面中,将刚刚创建的线程组重命名为“SQL方式”。按照如下方式设置属性:
    • Number of Threads---一般我们用来表示多少个用户,即我们测试时的用户数量,这里设置为5。

    • Ramp-Up Period(in seconds)---表示每个用户启动的延迟时间。如果设置为5秒,表示系统将在5秒结束前启动我设置的5个用户;如果设置为10秒,那么系统将会在10秒结束前启动这5个用户,也就是启动用户的延迟为2秒; 如果我设置为0秒,则表示立即启动所有用户。这里设置为5。
    • Loop Count---请求发生的重复次数。如果选择后面的forever(默认),那么 请求将一直继续;如果不选择forever,而在输入框中输入数字,那么请求将重复指定的次数;如果输入1,那么请求将执行一次。这里设置为1。

6. 创建JDBC连接

  • 右键单击左侧的“SQL方式”,在弹出的菜单中选择:添加->配置元件->JDBC Connection Configuration,就会创建一个新的JDBC连接。按照如下方式设置属性:

    • Variable Name---表示这个JDBC连接创建的连接池名字。这里设置为Oracle。

    • Validation Query---表示测试这个JDBC连接的语句。这里设置为“select 1 from dual”。
    • Database URL---JDBC连接字符串。因为我们要连接Oracle数据库,所以这里设置为“jdbc:oracle:thin:@10.2.11.17:1521:orcl”。
    • JDBC Driver class---JDBC驱动的类名。这里设置为“oracle.jdbc.driver.OracleDriver”。
    • Username---数据库用户名。
    • Password---密码。

7. 创建JDBC测试用例

  • 右键单击左侧的“SQL方式”,在弹出的菜单中选择:添加->Sampler->JDBC Request,就会创建一个新的JDBC测试用例。按照如下方式设置属性:

    • Variable Name---使用的JDBC连接池名字。这里设置为Oracle。

    • Query Type---SQL查询的类型,因为我们在SQL查询语句中使用参数,所以这里选择“Prepared Select Statement”。
    • Query---SQL查询语句,这里设置为“select * from user_info where user_name=?”。
    • Parameter values---SQL查询的参数,我们通过在CSV文件中读取参数的方式,获得变量的值。因为我们只设置了5个并发用户,我们的CSV文件一共需要6行(第一行为标题,后面5行为数据)。然后我们使用CSVRead函数读取CSV文件的内容,这里设置为
      ${__CSVRead(D:\download\c.csv,0)}

      其中的0表示CSV文件的第0列。如果我们的SQL查询语句有多个参数,可以在“Parameter values”中用逗号分隔继续写。例如:

      ${__CSVRead(D:\download\c.csv,0)},${__CSVRead(D:\download\c.csv,1)}
    • Parameter types---SQL查询参数的类型。这里设置为VARCHAR,如果有多个参数使用逗号分隔。

8. 添加监听器

  • 右键单击左侧的“SQL方式”,在弹出的菜单中选择:添加->监听器->Aggregate Graph,可以看到总览的结果。

  • 右键单击左侧的“SQL方式”,在弹出的菜单中选择:添加->监听器->查看结果树,可以看到每一次请求的详细信息,包括SQL语句、参数的内容、响应的结果、相应的时间等等。
  • 右键单击左侧的“SQL方式”,在弹出的菜单中选择:添加->监听器->用表格查看结果,可以表格的方式查看性能测试的结果。
  • 在菜单中选择:运行->启动,就会启动测试,等执行完毕之后,可以用这三个监听器查看一下测试的结果。
  • 总览的结果

  • 用结果树查看的结果

  • 用表格查看的结果

9. 安装Oracle Free Weblogic 12c for dev

到Oracle公司网站下载一个免安装的Oracle Weblogic 12c for dev

  • 首先解压缩这个zip的安装包,我是解压缩到了D:\weblogic-12120。

  • 然后按windows键+R,打开“运行”窗口,输入cmd,回车后即可打开命令提示符窗口。输入如下命令:
D:
cd D:\weblogic-12120
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_21
set MW_HOME=D:\weblogic-12120
configure.cmd

此时Weblogic安装程序开始解压缩安装包,可以通过查看标题条了解进度。

  • 解压缩完成之后,安装程序会自动设置好环境变量,并且提示是否需要配置一个新的域,输入“Y”进入下一步。
Do you want to configure a new domain? [Y/N] Y
  • 输入Weblogic管理员的用户名,我一般用weblogic。
Enter username to boot WebLogic server:weblogic
  • 输入Weblogic管理员的密码,我一般用weblogic123,这里要注意,如果输入纯数字的话可能会导致安装程序异常退出,原因是Weblogic管理员的密码必须既有字母也有数字。
Enter password to boot WebLogic server:

密码重复输入一遍之后就会创建一个默认的域:“mydomain”,路径在:

D:\weblogic-12120\user_projects\domains\mydomain

而且安装程序会直接启动这个域,可以在命令行界面中看到“The server started in RUNNING mode.”,表示mydomain域已经启动。

10. 在Weblogic中配置JDBC数据源
  • 用浏览器访问Weblogic管理界面:
http://localhost:7001/console

并且用weblogic/weblogic123登录,即可进入weblogic的管理界面。

  • 在主页选择:域配置->数据源,进入数据源配置界面。

  • 选择:新建->一般数据源,进入数据源创建页面。设置名称为:testdatasource,JNDI名称为:testdatasource,数据库类型为:Oracle。

  • 点击下一步,选择数据库驱动,保留默认即可。

  • 点击下一步,提示这个驱动的事务管理方式,直接再点击下一步,配置数据库连接的参数,相关参数设置如下:

    • 数据库名称---一般为数据库的SID或者Service_Name,我的设置为orcl。

    • 主机名---数据库服务器的主机名或者IP地址。
    • 数据库用户名---连接数据库所使用的用户名。
    • 口令---数据库用户的密码。

  • 点击下一步,用“测试配置”的功能可以测试数据库连接是否正确,如果有问题则需要回到上一步修改数据库连接的参数。如果没有问题,点击“完成”就创建好了这个指向Oracle数据库的JDBC数据源。

  • 然后需要将这个数据源部署到myserver中去,点击“testdatasource”,选择“目标”,然后选择“myserver”,点击“保存”,就将这个数据源部署到了myserver中。

11. 创建简单的JSP工程
  • 在目录“D:\weblogic-12120\user_projects\domains\mydomain”下新建一个目录:webtest。

  • 在webtest目录下创建一个WEB-INF的子目录,在子目录中创建web.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SQLTest</display-name> </web-app>
  • 在webtest目录下创建一个index.jsp文件,内容如下(注意使用UTF-8编辑):
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--首先导入一些必要的packages-->
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<!--设置中文输出--><html><head>
<title>SQL Test</title></head><body>
<%
//以try开始
try
{
String orig_param1 = request.getParameter("param1");
String param1 = new String(orig_param1.getBytes("ISO-8859-1"), "UTF-8"); Connection conn;
ResultSet rs; //建立数据库连接
Context ctx = new InitialContext();
DataSource ds =(DataSource)ctx.lookup("jndi/testdatasource");
conn = ds.getConnection(); //创建一个JDBC声明
String strsql = "select user_name from USER_INFO where user_name = ?";
PreparedStatement pstmt = conn.prepareStatement(strsql);
pstmt.setString(1, param1); //查询记录
rs = pstmt.executeQuery(); //输出查询结果
while (rs.next()) {
out.println(rs.getString("user_name"));
} //关闭数据库连结
rs.close();
pstmt.close();
conn.close();
} //捕获错误信息
catch (Exception e) {
out.println(e.getMessage());
} %>
</body></html>

到这里我们已经完成了一个最简单的JSP Web应用程序。

12. 在Weblogic中部署Web应用程序
  • 在Weblogic管理界面的主页中选择“部署”,进入部署管理界面.

  • 点击“安装”,就会进入目录选择界面,选择刚才创建的webtest目录,然后点击“下一步”。

  • 选择“将此部署安装为应用程序”,然后点击下一步。

  • 设置web应用程序的属性,保留默认即可,点击完成,就完成了web应用程序的部署。这时,可以在部署中看到新增了一个Web应用程序---webtest

打开一个浏览器,地址栏输入http://localhost:7001/webtest/index.jsp?param1=张三
可以看到返回了正确的结果。
下面我们回到JMeter,开始创建HTTP方式的测试

13. 在JMeter中添加线程组
  • 右键单击左侧的“我的数据库测试计划”,在弹出菜单中选择:添加->Threads(Users)->线程组,就会创建一个新的线程组。

  • 在右侧的属性界面中,将刚刚创建的线程组重命名为“HTTP方式”。按照如下方式设置属性:
    • Number of Threads---设置为5。

    • Ramp-Up Period(in seconds)---设置为5。
    • Loop Count---设置为1。

14. 创建HTTP测试用例
  • 右键单击左侧的“HTTP方式”,在弹出的菜单中选择:添加->Sampler->HTTP请求,就会创建一个新的HTTP测试用例。按照如下方式设置属性:

    • 服务器名称或IP---设置Weblogic服务器的IP地址。这里设置为localhost。

    • 端口号---设置Weblogic应用监听的端口。这里设置为7001。
    • 路径---测试用例所使用的Web页面路径,这里我们使用刚刚创建的index.jsp,设置为/webtest/index.jsp。
    • 同请求一起发送的参数---可以指定用GET或POST方式向Web应用程序发送参数,这里我们点击“添加”,就会增加一行,名称设置为param1,值设置为${__CSVRead(D:\download\c.csv,0)}

15. 添加监听器
  • 右键单击左侧的“HTTP方式”,在弹出的菜单中选择:添加->监听器->Aggregate Graph,可以看到总览的结果。

  • 右键单击左侧的“HTTP方式”,在弹出的菜单中选择:添加->监听器->查看结果树,可以看到每一次请求的详细信息,包括参数的内容、响应的结果、相应的时间等等。
  • 右键单击左侧的“HTTP方式”,在弹出的菜单中选择:添加->监听器->用表格查看结果,可以表格的方式查看性能测试的结果。
  • 在菜单中选择:运行->启动,就会启动测试,等执行完毕之后,可以用这三个监听器查看一下测试的结果。
16. 结束语

完毕

 

使用Apache JMeter进行SQL优化性能测试的更多相关文章

  1. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(四)

    这篇文章是对前面三篇的一个总结: 1.从测试结果来看,原生的数据库性能分别是:SQL Server(4587)>Oracle(271)>Mysql(145),测试数据量分别为5W.50W. ...

  2. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(一)

    前段时间面试被问到了数据库方面的知识:比如选择什么样的数据库,如何优化,怎么加索引,于是想到了自己动手测试一下常用数据库的性能: 第一步,下载好JMeter之后打开运行.话说这个JMeter打开还真是 ...

  3. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(三)

    接第二篇写 第四步,测试Oracle数据库的性能. a.加载JDBC Oracle驱动,添加线程组和线程属性和前面两部一样,如果有需要可以往前翻看. b.设置JDBC Connection Oracl ...

  4. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(二)

    接着第一篇的写: 第三步,测试SQL Server数据库的性能: a.加载JDBC SQL Server驱动.添加线程组和设置线程属性和第二步一样,就不再赘述了: b.设置JDBC Connectio ...

  5. Apache JMeter (二)性能测试 入门实例

    上一节我们说了关于Jmeter环境的配置,接下来讲一个测试的实例. 1.运行Jmeter 进入Jmeter程序所在目录,运行"bin/jmeter.bat" Jmeter支持中文, ...

  6. 【转】利用 Apache JMeter 测试 WebSphere 性能

    如果您预算紧张并且时间紧迫 —— 或者即使您不是这样 —— 那么,您可能希望考虑使用 JMeter 来对 Web 和其他应用程序进行压力测试.IBM 的 Greg Herringer 详细描述他使用这 ...

  7. 性能测试工具 - Apache JMeter (安装)

    简介 Apache JMeter 是100%纯java语言开发的负载测试和性能测试开源工具. 功能 Apache JMeter可以对静态/动态资源进行性能测试,模拟多个用户并行请求资源端,以测试其强度 ...

  8. FW 常见的性能测试工具有: loadRunner/netperf/httperf/apache_ab/Apache JMeter

    常见的性能测试工具有: loadRunner/netperf/httperf/apache_ab/Apache JMeter , 其中loadRunner属于付费软件,所以在这里不做介绍 netper ...

  9. Tomcat8优化--Apache JMeter测试

    一.部署测试java web项目(压力测试环境搭建) 1.mysql环境 #切换到mysql目录 cd /usr/local/mysql #查看mysql环境 rpm -qa | grep -i my ...

随机推荐

  1. Map基本用法

    Map的基本用法 map内部使用的是红黑树,在map内部所有的数据都是有序的 map插入有三种方法: insert(pair<int,string>(i,str)); myMap.inse ...

  2. tttt

    while(scanf("%d",&n)!=EOF) { res=-1; level(tmp,n,res,1); printf("%d/n",res); ...

  3. ci 的控制器文件夹下开加子文件夹

    在一个比较大的项目中,希望controllers下再细分子文件夹.例如:controllers/pj,controllers/xxk等. 做法是: 1.在controllers下添加相关的子文件夹,例 ...

  4. CSS定义网页滚动条

    (一)滚动条样式主要涉及到如下CSS属性: overflow属性: 检索或设置当对象的内容超过其指定高度及宽度时如何显示内容overflow: auto; 在需要时内容会自动添加滚动条overflow ...

  5. .net mvc结合微软提供的FormsAuthenticationTicket登陆

    一.Web.config <system.web> <compilation debug="true" targetFramework="4.5&quo ...

  6. scala学习笔记-类型参数中协变(+)、逆变(-)、类型上界(<:)和类型下界(>:)的使用

    转载自  fineqtbull   http://fineqtbull.iteye.com/blog/477994 有位je上的同学来短信向我问起了Scala类型参数中协变.逆变.类型上界和类型下界的 ...

  7. Dijkstra算法C#实现及其布线运用

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下是空调布线对Dijkstra算法的运用,采用C#实现. 问题:室内机多台,室外机一台.寻找室内 ...

  8. 懂说话,让冲突、尴尬时刻都bye-bye

    回忆一下自己从小到大的成长历程,你容不容易交到新朋友?在不熟悉的社交场合中,你是否也曾面临坐立难安.不知从何聊起的窘境?事实上,无论身处学校或社会,担任职务是基础或高阶,终其一生都会派上用场的能力,就 ...

  9. 处理emacs-org模式TODO的一个脚本

    处理前: 处理后: Table of Contents 1 前言 2 中文的处理 2.1 vim相关 2.2 perl 相关 3 时间相关 4 程序解析 1 前言 最近风帆问我一个问题,也就是处理or ...

  10. 【剑指offer】面试题34:丑数

    题目: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路: 第一 ...