2019独角兽企业重金招聘Python工程师标准>>>

今天工作需要要写一个小工具来测试一下数据库的写入性能,需要支持多并发,并且支持调整事务提交记录大小,所以就用Java写了一个,就一个类,比较简单但是基本功能都有了,下面看看代码实现

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Formatter;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.logging.Level;
import java.util.logging.Logger;public class InsertTest {private static Logger logger = Logger.getLogger(InsertTest.class.getName());private static final String DB_DRIVER = "com.ibm.db2.jcc.DB2Driver";private static final String DB_URL = "jdbc:db2://9.111.251.152:50000/padb";private static final String DB_USERNAME = "db2inst";private static final String DB_PASSWORD = "Letmein";private static Random random = new Random(10000);private static final String TABLE_NAME = "BENCHMARK";private int batchSize;private int concurrent;private int sampling;public static void main(String[] args) throws Exception {printHeader();int[] concurrentList = new int[]{1, 5, 10, 20};int[] batchSizeList = new int[] {1000, 2000, 5000, 10000};for (int concurrent : concurrentList) {for (int batchSize : batchSizeList) {new InsertTest(batchSize, concurrent).run(true);}Thread.sleep(10000);}}public InsertTest(final int batchSize, final int concurrent) throws Exception {this.batchSize = batchSize;this.concurrent = concurrent;this.sampling = 100;}public InsertTest(final int batchSize, final int concurrent, final int sampling) throws Exception {this.batchSize = batchSize;this.concurrent = concurrent;this.sampling = sampling;}public void run(boolean printResult) throws Exception {final List<Long> results = Collections.synchronizedList(new ArrayList<Long>());final CountDownLatch startGate = new CountDownLatch(concurrent);final CountDownLatch endGate = new CountDownLatch(concurrent);for (int idxConcurrent = 0; idxConcurrent < concurrent; idxConcurrent++) {new Thread(new Runnable() {public void run() {startGate.countDown();try {long time = execute();long avg = batchSize * sampling * 1000 / time;;results.add(Long.valueOf(avg));} catch(Exception ex) {ex.printStackTrace();} finally {endGate.countDown();}}}).start();}endGate.await();Collections.sort(results);if (printResult) {printResult(batchSize, concurrent, results);}}public long execute() throws Exception {Connection conn = getConnection();Map<String, Integer> columns = queryTableColumns(conn);String insertSQL = generateInsertSQL(columns);PreparedStatement ps = conn.prepareStatement(insertSQL);try {long start = System.currentTimeMillis();for (int i = 0; i < sampling; i++) {execute(conn, ps, columns);}long stop = System.currentTimeMillis();return stop - start;} catch(Exception ex) {logger.log(Level.SEVERE, null, ex);conn.rollback();conn.close();throw ex;} finally {conn.close();}}public void execute(Connection conn, PreparedStatement ps, Map<String, Integer> columns) throws Exception {try {for (int idx = 0; idx < batchSize; idx++) {int idxColumn = 1;for (String column : columns.keySet()) {if (column.equalsIgnoreCase("ID")) {ps.setObject(idxColumn, UUID.randomUUID().toString());} else {ps.setObject(idxColumn, generateColumnValue(columns.get(column)));}idxColumn ++;}ps.addBatch();}ps.executeBatch();conn.commit();ps.clearBatch();} catch (SQLException ex) {logger.log(Level.SEVERE, null, ex);if (null != ex.getNextException()) {logger.log(Level.SEVERE, null, ex.getNextException());}conn.rollback();throw ex;}}private String generateInsertSQL(Map<String, Integer> columns) throws SQLException {StringBuilder sb = new StringBuilder();StringBuffer sbColumns = new StringBuffer();StringBuffer sbValues = new StringBuffer();sb.append("INSERT INTO ").append(TABLE_NAME);for (String column : columns.keySet()) {if (sbColumns.length() > 0) {sbColumns.append(",");sbValues.append(",");}sbColumns.append(column);sbValues.append("?");}sb.append("(").append(sbColumns).append(")");sb.append("VALUES");sb.append("(").append(sbValues).append(")");return sb.toString();}private Map<String, Integer> queryTableColumns(Connection conn) throws Exception {Map<String, Integer> columns = new LinkedHashMap<String, Integer>();String sql = "SELECT * FROM " + TABLE_NAME + " WHERE 1=0";Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);ResultSetMetaData rsmd = rs.getMetaData();for (int i = 1; i <= rsmd.getColumnCount(); i++) {columns.put(rsmd.getColumnName(i), rsmd.getColumnType(i));}return columns;}private Object generateColumnValue(int type) {Object obj = null;switch (type) {case Types.DECIMAL:case Types.NUMERIC:case Types.DOUBLE:case Types.FLOAT:case Types.REAL:case Types.BIGINT:case Types.TINYINT:case Types.SMALLINT:case Types.INTEGER:obj = random.nextInt(10000);break;case Types.DATE:obj = Calendar.getInstance().getTime();break;case Types.TIMESTAMP:obj = new Timestamp(System.currentTimeMillis());break;default:obj = String.valueOf(random.nextInt(10000));break;}return obj;}private Connection getConnection() throws Exception {Class.forName(DB_DRIVER);Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);conn.setAutoCommit(false);return conn;}private static void printHeader() {StringBuilder sb = new StringBuilder();sb.append("\n");sb.append(new Formatter().format("%15s|%15s|%15s|%15s|%15s", "BATCH_SIZE", "CONCURRENT", "AVG (r/s)", "MIN (r/s)", "MAX (r/s)"));System.out.println(sb.toString());}private static void printResult(int batch, int concurrent, List<Long> results) {Long total = Long.valueOf(0);for (Long result : results) {total += result;}StringBuilder sb = new StringBuilder();sb.append(new Formatter().format("%15s|%15s|%15s|%15s|%15s", batch, concurrent, (total/results.size()), results.get(0), results.get(results.size() - 1)));System.out.println(sb.toString());}
}

要运行测试需要
1. 修改数据库的配置信息
2. 修改TABLE_NAME指定数据库里需要测试的表名,测试程序会查询这个表的定义来生成写入SQL语句
3. 修改concurrentList指定需要测试并发数列表,默认测试1,5,10,20个并发
4. 修改batchSizeList指定每次测试的事务提交记录数据,默认是1000,2000,5000,10000

最后运行测试,会生成类似下面的结果

BATCH_SIZE|     CONCURRENT|      AVG (r/s)|      MIN (r/s)|      MAX (r/s)1000|              1|            ...|            ...|            ...2000|              1|            ...|            ...|            ...5000|              1|            ...|            ...|            ...10000|              1|            ...|            ...|            ...1000|              5|            ...|            ...|            ...2000|              5|            ...|            ...|            ...5000|              5|            ...|            ...|            ...10000|              5|            ...|            ...|            ...

转载于:https://my.oschina.net/ydsakyclguozi/blog/396893

数据库写入性能测试小工具相关推荐

  1. Android 性能测试小工具 Emmagee

    Emmagee 是一个性能测试小工具 用来监控指定被测应用在使用过程中占用机器的CPU, 内存,流量资源的性能小工具 Emmagee 介绍 Emmagee是网易杭州研究院QA团队开发的一个简单易上手的 ...

  2. Windows 7环境下网站性能测试小工具 Apache Bench 和 Webbench使用和下载

    1.简要说明: Apache Bench 是Apache的网站性能测试小程序,Windows平台下的程序名简称ab.exe,要想获得这个80k的可执行程序,用户需要下载整个Apache Httpd软件 ...

  3. app的性能测试小工具monkey使用教程

    Monkey app的性能测试小工具monkey使用教程 功能: 是一个稳定性测试(疲劳测试)小工具: 也可以是随机测试小工具 Monkey工具使用过程: A)使用adb shell命令进入到安卓手机 ...

  4. Android 性能测试小工具 (cpu,内存,电量,流量数据浮窗显示,信息导入数据库、sd卡)

    [mie haha的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qq_40315080/article/details/98610748 写一个测试各个app/手 ...

  5. 分享一下自己用的SQLite数据库密码操作小工具(含源码)

    SQLite(http://www.hwaci.com/sw/sqlite/download.html)的优势以及wxsqlite(http://wxcode.sourceforge.net/comp ...

  6. java数据库model,牛刀杀鸡的java数据库生成model小工具

    前言 重复且无用的工作是每个码农必须避免的,DRY(don't repeat yourself)原则也是每个码农重要的素质,当你第二次重复某件事还可以忍受,但是你第三次重复某件事就一定想办法去改变它, ...

  7. 卸载mysql数据库,利用小工具超级简单!!!

    1.去网盘下载工具(内存很小!!) 链接:https://pan.baidu.com/s/1oYFf7r14U1H6Sgx9LVPsBA?pwd=hszs 提取码:hszs 2.进入工具 3.然后根据 ...

  8. Linux 显示IP地理位置 qqwry系列小工具

    围绕纯真数据库的一系列小工具 qqwry.c,qqwry.h.一个c实现的lib,用来从纯真数据库里获取ip地址信息.下载,文档 nali,一组ip查询工具,包括可以让dig,traceroute显示 ...

  9. python读取excel写入数据库_python实现读取excel写入mysql的小工具详解

    Python是数据分析的强大利器 利用Python做数据分析,第一步就是学习如何读取日常工作中产生各种excel报表并存入数据中,方便后续数据处理. 这里向大家分享python如何读取excel,并使 ...

最新文章

  1. ajax实现异步校验
  2. springmvc十四:请求处理
  3. SQL2005对字符串进行MD5加密
  4. node.js和npm的关系
  5. sql语句提高数据库查询效率
  6. FckEditor配置详解
  7. pythonfor循环输入_Python之for循环的使用
  8. 八、高级依赖关系配置
  9. 2016年小升初海淀区全部初中排名分析
  10. 关于我对游戏开发的理解
  11. 光纤连接器的连接方法
  12. 编程初学者如何缓解迷茫和焦虑?墙裂推荐此文,助你赢在起跑线
  13. C++ 函数的递归调用
  14. 学好python可以实现财务自由哦—python基础教学(二)
  15. mysql的mtr是指什么_关于innodb mtr模块
  16. DDP及其在pytorch中应用
  17. 压箱底的Mac解压缩软件大放送
  18. centos 7 查看磁盘io ,找出占用io读写很高的进程
  19. 成熟的J2EE框架应该具体的功能
  20. AI CC2019中文破解版软件下载及安装教程(附破解包)

热门文章

  1. 趣文:如果像招聘程序员那样招聘木匠
  2. Linux之lastb命令
  3. linux之lsof使用技巧
  4. linux之sshpass命令
  5. Spring限定注入逻辑分组@Qualifier
  6. RHEL7和RHEL6的主要变化
  7. sass import 小记
  8. RecyclerView 下拉刷新上拉加载
  9. non linear processor
  10. iOS 编译百度地图静态库-合二为一