java 数据库压力测试 源码
实验环境:
数据库:Mysql
语言:java
原理:
使用java多线程模拟并发环境,不断对数据库进行查询操作,求查询的最大最小平均时间。
简介:
数据库压侧是对数据库的数据查询、修改等操作在面向大量用户发出request的请求下的反应情况。可以使用的工具有很出名的Jmeter,原理就是通过jdbc与数据库交互,通过多线程机制模拟并发,达到压测的目的。针对于Mysql的压测工具有Mysql自带的MySqlSlap,一个很强大的压测工具,可以通过命令行让其自动生成SQl语句进行测试,可以测试不同的存储引擎、支持插入、删除等测试,支持单条、批量查询测试等等,之前想通过python脚本调用这个工具来实现压测的一些功能,但是由于我要达到的目的是在查询语句模板(select* from table where id = #key#)中这个key值是随机的,而且模板是有很多个的,MySQlSlap在自定义查询语句上,貌似只支持固定的查询,即不是随机变换的查询,这样就会出现一个问题,就是查询中数据库可能会产生针对于相同语句的缓存,这样查询的时间就会不准确。可以说MysqlSlap是一个测试数据库的抗压能力的工具,而不是一个测试查询语句执行效率的工具(拙见。。。);
1. 首先,加载你的sql模板文件,这个模板文件类似:
select * from table where id = #key# and pid=#key2#
select * from table where id = #key#
select * from table;
2.sql生成代码:
public class SqlGenerator {
private static final Logger logger = Logger.getLogger(SqlGenerator.class);
public List<String> GenerateSQl(List<String> arguments, String sqlfiletemplate){//arguments是替换key的真正的值,在模板文件中key只是一个占位符
List<String> returnGenerateSQL = new ArrayList<String>();
try {
BufferedReader br = new BufferedReader(new FileReader(new File(sqlfiletemplate)));//读取模板文件
String line = "";
int lineindex= 0;
String[] sqlparts = null;
try {
while((line = br.readLine()) != null ){
sqlparts = line.split("#");
if (arguments.size() == sqlparts.length / 2 || arguments.size() == (sqlparts.length -1 ) / 2){
for (int i =0 ;i < sqlparts.length; ++i){
if (i % 2 != 0){
sqlparts[i] = arguments.get(i / 2);//替换key值
}
}
}else{
logger.error("The " + lineindex + " line parse error!");
}
++lineindex;
returnGenerateSQL.add(StrArrayToStr(sqlparts).toString());//返回List,包括所有产生的查询语句
}
} catch (IOException e) {
logger.error("read the template error!");
return null;
}
return returnGenerateSQL;
} catch (FileNotFoundException e) {
logger.error("tempate file not found!");
return null;
}
}
private StringBuffer StrArrayToStr(String[] strarray){
StringBuffer sb = new StringBuffer();
for (String str : strarray){
sb.append(str);
}
return sb;
}
}
3.关于从数据库中随机抽取key值的部分:
public void init(){
if (key_to_replace != null){//key_to_replace是key的数组
totalcounts = new int[key_to_replace.size()];
for (int i = 0; i < key_to_replace.size(); ++i){
totalcounts[i] = daomysql.getJdbcTemplate().queryForInt("select count(*) from (select distinct " + key_to_replace.get(i) +" from xxxxx) b");\\通过JdbcTemplate获取每个key(上面中要替换的值)到底有多少个&#x