一、准备工作【部署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和物理机相差无几




