暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于Docker的mysql压测

考拉苑 2016-10-31
387

一、准备工作【部署mysql镜像】

(1)、具体Dockerfile如下

#指定基础环境镜像

FROM centos:centos6

#镜像维护者信息

MAINTAINER JDD "wangmiaomaio@jiangduoduo.com"

#安装mysql server

RUN yum install -y mysql-server mysql

#将mysql添加到随机启动  指定mysql密码 测试连接mysql 执行show databases

RUN etc/init.d/mysqld start &&\

mysql -e "grant all privileges on *.* to 'root'@'%' identified by 'letmein';"&&\

mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'letmein';"&&\

mysql -u root -pletmein -e "show databases;"

#监听容器3306端口

EXPOSE 3306

#启动mysql

CMD ["/usr/bin/mysqld_safe"]

(2)、编译dockerfile

sudo docker build -t mysql-server .

(3)、启动mysql容器

sudo docker run --name=mysqlserver -d -p 3306:3306 mysql_server

(4)、查看启动容器

sudo docker ps

至此mysql容器部署完成

二、准备demo

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Statement;

/**

MySql 插入(insert)性能测试

Oracle 插入(insert)性能测试

MySql建表语句:

CREATE  TABLE `dev`.`test_insert` (

`id` INT NOT NULL ,

`uname` VARCHAR(10) NULL ,

PRIMARY KEY (`id`) )

ENGINE = InnoDB;

*/

public class JdbcInsterTest {

   static int  count=100000;//总次数

   //一定要写rewriteBatchedStatements参数,Mysql批量插入才性能才理想

   static String mySqlUrl="jdbc:mysql://192.168.99.100:3306/test?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&";

   //static String mySqlUrl="jdbc:mysql://127.0.0.1:3306/test?rewriteBatchedStatements=true";

   static String mySqlUserName="root";

   //static String mySqlPassword="admin123456";

   static String mySqlPassword="letmein";

   static String oracleurl="jdbc:oracle:thin:@192.168.10.139:1521:orcl";

   static String oracleuserName="scott";

   static String oraclepassword="tiger";

   static String sql = "insert into test_insert(id,uname) values(?,?)";

   //每执行几次提交一次

   //static int[] commitPoint={count,10000,1000,100};

   static int[] commitPoint={count,10000};

   public static void main(String[] args) {

       /*for(int point:commitPoint){

          test_mysql(point);

       }*/

       for(int point:commitPoint){

           test_mysql_batch(point);

       }

//     for(int point:commitPoint){

//            test_oracle(point);

//     }

//     for(int point:commitPoint){

//            test_oracle_batch(point);

//     }

   }

   /**

    * 创建连接

    * @return

    */

   public static Connection getConn(String flag){

       long a=System.currentTimeMillis();

       try {

           if("mysql".equals(flag)){

               Class.forName("com.mysql.jdbc.Driver");

               Connection conn =  DriverManager.getConnection(mySqlUrl, mySqlUserName, mySqlPassword);

               conn.setAutoCommit(false);

               return conn;

           }else if("oracle".equals(flag)){

               Class.forName("oracle.jdbc.OracleDriver");

               Connection conn =  DriverManager.getConnection(oracleurl, oracleuserName, oraclepassword);

               conn.setAutoCommit(false);

               return conn;

           }else{

               System.out.println();

               throw new RuntimeException("flag参数不正确,flag="+flag);

           }

       } catch (Exception ex) {

           ex.printStackTrace();

       }finally{

           long b=System.currentTimeMillis();

           System.out.println("创建连接用时"+ (b-a)+" ms");

       }

       return null;

   }

   /**

    * 关闭连接

    * @return

    */

   public static void close(Connection conn){

       try {

           if(conn!=null){

               conn.close();

           }

       } catch (SQLException e) {

           e.printStackTrace();

       }

   }

   /**

    * 删除旧数据

    * @return

    */

   public static void clear(Connection conn){

       try{

           Statement st=conn.createStatement();

           boolean bl=st.execute("delete FROM test_insert");

           conn.commit();

           st.close();

           System.out.println("执行清理操作:"+(bl==false?"成功":"失败"));

       }catch(Exception e){

           e.printStackTrace();

       }

   }

   /**

    * 打印信息

    * @return

    */

   public static void print(String key,long startTime,long endTime,int point){

       System.out.println("每执行"+point+"次sql提交一次事务");

       System.out.println(key+",用时"+ (endTime-startTime)+" ms,平均每秒执行"+(count*1000/(endTime-startTime))+"条");

       System.out.println("----------------------------------");

   }

   /**

    * mysql非批量插入10万条记录

    */

   public static void test_mysql(int point){

       Connection conn=getConn("mysql");

       clear(conn);

       try {

           PreparedStatement prest = conn.prepareStatement(sql);

           long a=System.currentTimeMillis();

           for(int x = 1; x <= count; x++){

               prest.setInt(1, x);

               prest.setString(2, "张三_"+x);

               prest.execute();

               if(x%point==0){

                   conn.commit();

               }

           }

           long b=System.currentTimeMillis();

           print("MySql非批量插入10万条记录",a,b,point);

       } catch (Exception ex) {

           ex.printStackTrace();

       }finally{

           close(conn);

       }

   }

   /**

    * mysql批量插入10万条记录

    */

   public static void test_mysql_batch(int point){

       Connection conn=getConn("mysql");

       clear(conn);

       try {

           PreparedStatement prest = conn.prepareStatement(sql);

           long a=System.currentTimeMillis();

           for(int x = 1; x <= count; x++){

               prest.setInt(1, x);

               prest.setString(2, "张三");

               prest.addBatch();

               if(x%point==0){

                   prest.executeBatch();

                   conn.commit();

               }

           }

           long b=System.currentTimeMillis();

           print("MySql批量插入10万条记录",a,b,point);

       } catch (Exception ex) {

           ex.printStackTrace();

       }finally{

           close(conn);

       }

   }

   /**

    * oracle非批量插入10万条记录

    */

   public static void test_oracle(int point){

       Connection conn=getConn("oracle");

       clear(conn);

       try {

           PreparedStatement prest = conn.prepareStatement(sql);

           long a=System.currentTimeMillis();

           for(int x = 1; x <= count; x++){

               prest.setInt(1, x);

               prest.setString(2, "张三");

               prest.execute();

               if(x%point==0){

                   conn.commit();

               }

           }

           long b=System.currentTimeMillis();

           print("Oracle非批量插入10万记录",a,b,point);

       } catch (Exception ex) {

           ex.printStackTrace();

       }finally{

           close(conn);

       }

   }

   /**

    * oracle批量插入10万条记录

    */

   public static void test_oracle_batch(int point){

       Connection conn=getConn("oracle");

       clear(conn);

       try {

           PreparedStatement prest = conn.prepareStatement(sql);

           long a=System.currentTimeMillis();

           for(int x = 1; x <= count; x++){

               prest.setInt(1, x);

               prest.setString(2, "张三");

               prest.addBatch();

               if(x%point==0){

                   prest.executeBatch();

                   conn.commit();

               }

           }

           long b=System.currentTimeMillis();

           print("Oracle批量插入10万记录",a,b,point);

       } catch (Exception ex) {

           ex.printStackTrace();

       }finally{

           close(conn);

       }

   }

}

三、测试结果【请看程序的控制台输出】

自此以上完成测试基于docker的mysql数据插入:非批量和批量 结果明显使用批量性能优势明显 甚至超过物理机批量测试结果


四、通过jmeter压测基于docker mysql的查询

1.打开JMeter,点击测试计划,

点击“浏览...”按钮,将你的JDBC驱动添加进来。

2.添加一个线程组,

右键点击“线程组”,在下面添加一个“JDBC Connection Configuration”

来配置一下JDBC Connection Configuration页面。

3.右键点击“线程组”,在下面添加一个“JDBC request”

4.添加断言。

右键点击线程组---->添加--->断言---->响应断言。

5.我们来添加一些监听器来行查看

添加一个断言结果:

右键点击线程组---->添加--->监听器---->结果断言。

添加一个图形结果:

右键点击线程组---->添加--->监听器---->图形结果。

添加一个查看结果树:

右键点击线程组---->添加--->监听器---->查看结果树。

下面是添加所有东东的列表:

6.在线程组页面设置用户数、启动时间、循环次数

点击菜单栏“运行”----“启动”

下面是结果:

结果:

1、插入

非批量插入: docker远远低于物理机

批量插入:  docker性能超过物理机

2、查询

非指定条件: docker被物理机碾压

指定条件:docker和物理机相差不多

3、更新、删除

docker和物理机相差无几


文章转载自考拉苑,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论