文章来自:http://blog.csdn.net/kongxx/article/details/42360663
今天工作需要要写一个小工具来测试一下数据库的写入性能,需要支持多并发,并且支持调整事务提交记录大小,所以就用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| ...| ...| ...
相关推荐
2)生成数据可写入数据库:mysql、oracle、elasticsearch、clickhouse,兼做数据写入性能测试 3)支持生成的数据以restful接口提供,供外部应用做接口测试 4)其他小工具.... 版本历史: V0.6.109, 2018-3-26 [+] ...
大数据测试第二阶段 《Hadoop平台基础能力测试方法》 《Hadoop平台性能测试方法》 性能测试在基准测试的基础上进行了升级,如图2所示,增加了SQL用例的比重,按照SQ L任务的类型,从两个维度确立了5类任务,分别是...
针对Access、SQL Server 2000以及LabVIEW自带的TDMS数据库进行了相关存储性能的测试。对前两种数据库分别采用LabSQL和数据库连接工具包所提供的算法进行了比较分析。
电脑性能跑分软件是一款类似于安卓手机跑分软件一样的小工具,该工具界面简洁,操作方便,体积小,功能不错,主要可以用它来测试电脑的性能。 电脑性能跑分软件功能: 1、程序结合互联网支持库和操作系统界面功能...
2.4.1 其它检查、测试和试验指除化学分析、热处理工艺检查、机械性能试验以外,一切检查、测试和试验,包括自定义的检查、测试和试验。 2.4.2 “检查、测试和试验标准的数据表”:通过联接字段和值过滤字段从“检查...
Datafaker-伪造数据的... 数据库性能测试。 生成大量测试数据以测试数据库性能 流数据测试。 对于kafka流数据,有必要连续生成测试数据以写入kafka。 经过研究,目前尚无用于在mysql表中生成结构相似的数据的开源测试
这是一款检测电脑性能的娱乐小工具,对CPU、显卡、硬盘、宽带等各项参数进行测试,并把测试结果以跑分的形式计算出来。小伙伴们,快来测试下自己的电脑能跑多少分吧! 测试参数: CPU:整数性能 CPU:浮点数性能 ...
由于近期有个项目对系统性能要求很高,技术选型上由于种种原因已经确定使用Mysql数据库,接下来就是要确定到底使用哪种存储引擎。我们的应用是典型的写多读少,写入内容为也很短,对系统的稳定性要求很高。所以存储...
当然最终使用patch的时候还需要在测试环境做测试,因为测试数据库是和生产数据库环境最接近的。(上面说的克隆cloning是一种将applications layer和database layer完全复制的一种方法。)所以,当你拥有这三个数据库...
PD leader 尽量与 etcd leader 保持同步,提升写入性能 优化 Region heartbeat 性能,现可支持超过 100 万 Region TiKV: 1.功能 保护关键配置,防止错误修改 支持 `Region Merge` [experimental] 添加 `Raw ...
§1.7 数据库写入进程 34 §1.8 日志写进程 34 §1.9 数据库检查点 34 §1.10 归档处理 35 §1.11 程序全局区(PGA) 35 第2章 警告日志与跟踪日志 35 §2.1 警告与日志文件 36 §2.1.1 经常查看警告日志文件内容 36...
4.15.5 将SQL*Plus输出结果写入文件 4.16 本章 测验 第5章 PL/SQL 5.1 PL/SQL定义和使用PL/SQL的原因 5.2 基本PL/SQL编程结构 5.3 定义PL/SQL数据类型 5.3.1 有效字符集 5.3.2 算术操作符 5.3.3 varchar2类型 ...
AIDA64不仅提供了诸如协助超频,硬件侦错,压力测试和传感器监测等多种功能,而且还可以对处理器,系统内存和磁盘驱动器的性能进行全面评估。AIDA64 Extreme Edition 简称 AIDA64,可以详细的显示出计算机内存读取/...
用法:kvbench选项概述kvbench是一个简单的基准测试工具,用于在并行应用写入时评估键/值存储的读取性能。 详细信息:运行基准测试包括两个步骤:(1)生成用法:kvbench选项概述kvbench是一个简单的基准测试工具,...
服务器是学生服务器,就是腾讯那个10元的服务器,在本地利用jmeter压测工具设置5000个线程、10000个请求时,首页的QPS为1024,而秒杀接口则为1678,可能服务器的问题,我感觉QPS不应该这么低。 # 项目的运行 在...
你使用最顺手的性能分析工具分析,发现瓶颈在于一个小函数,这个函数的作用是将一个长的字符串链表写到一文件中。 你对这个函数做了如下优化:将所有的小字符串连接成一个长的字符串,执行一次文件写入操作,避免...
特别是阿里,我一直面临着堆消耗随着时间的推移而增加的问题,因为它是一个旨在执行实时分析的负载测试工具。 我很少探索提供简单 API 的快速 TSDB 库,但最终没有任何效果如我所愿,这就是我决定自己编写这个包的...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...