YCSB擴充套件-語句執行頻率,執行指定的測試查詢語句
引言
ycsb是雅虎開源的一款通用的效能測試工具,該工具的特點是小巧,靈活,擴充套件性強。網上已經有很多有關ycsb使用的介紹如文獻[1-2]。文獻[3 ]為ycsb git中的官方文件,包含了ycsb的使用,配置檔案各引數的詳細說明。文獻[4 ]使用ycsb對HBASE進行測試,並通過修改原始碼,達到了符合自身的測試要求。本文使用ycsb對MongoDB資料庫進行測試,並擴充套件其原始碼使ycsb支援瞭如下功能:(1)支援測試語句執行的時間頻率,即每隔一定的時間執行一條語句;(2)執行指定的sql語句
ycsb簡單分析
ycsb-properties展示了配置檔案各引數的說明,其中target參數列示指的是每秒最大運算元,當一秒內到達這個閾值,執行緒就會休眠1毫秒。顯然,ycsb並沒有很好的支援每隔一定時間執行一條語句的功能。並且ycsb執行的語句時ycsb系統設定好的語句,使用者並不能指定特殊的語句執行。以上兩個問題是本文要解決的問題。
背景介紹
本事測試的資料庫為MongoDB,所以出現的程式碼均為與測試MongoDB的程式碼相關。並只修改了讀操作。對於其他操作大家舉一反三吧。
問題解決
配置檔案workloada:
mongodb.url=mongodb://10.0.0.1:27017 #mongodb的連線機制
mongodb.database=test #測試的資料庫名
table=test #集合名
mongodb.writeConcern=normal
timeseries.granularity=200 #每隔200毫秒列印一次資訊
operationcount=1000 #執行10000條語句
delaytime=200 #每隔200毫秒執行一條資料,ycsb並沒有該資料,是作者自己加的
readallfields=true
measurementtype=timeseries
workload=com.yahoo.ycsb.workloads.CoreWorkloadMY #自己編寫的查詢類,系統預設為CorWorkload
readproportion=1 #只進行讀操作
updateproportion=0
scanproportion=0
insertproportion=0
requestdistribution=zipfian
CoreWorkloadMY類。在ycsb-master\core\src\main\java\com\yahoo\ycsb\workload\資料夾下增加CoreWorkloadMY類。CoreWorkloadMY類基於CoreWorkload類進行了修改,程式碼只展示了增加和修改的地方,其他與CoreWorkload類相同。
public class CoreWorkloadMY extends Workload{
/**
* 預設延遲時間
*/
public static final String DELAYTIME_PREFIX_DEFAULT = "0";
/**
* 延遲時間
*/
int delayTime;
public void init(Properties p) throws WorkloadException {
delayTime = Integer.parseInt(p.getProperty(DELAYTIME_PREFIX, DELAYTIME_PREFIX_DEFAULT));
}
public void doTransactionRead(DB db) {
int keynum = 0;
String keyname = "";
HashSet<String> fields = null;
db.read(table, keyname, fields, new HashMap<String, ByteIterator>());
try{
Thread.sleep(delayTime);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
MongoDbClient類修改,由於CoreWorkloadMY中的db是MongoDbClient的實體物件,因此MongoDbClient類中的read操作同樣需進行修改,同樣,下面程式碼只展示了修改的部分,其他部分與原有的MongoDbClient程式碼相同。該檔案位置在ycsb-master\mongodb\src\main\java\com\yahoo\ycsb\db下。
public class MongoDbClient extends DB {
public int read(String table, String key, Set<String> fields,
HashMap<String, ByteIterator> result) {
com.mongodb.DB db = null;
try{
db = mongo.getDB(database);
db.requestStart();
DBCollection collection = db.getCollection(table);
DBObject queryResult = null;
queryResult = collection.findOne(); //這裡寫自己的特定的查詢語句
return queryResult != null ? 0 : 1;
} catch (Exception e){
System.err.println(e.toString());
return 1;
} finally {
if (db!=null)
{
db.requestDone();
}
}
}
}
完後,使用maven打包、釋出就可以使用了。
參考文獻
相關文章
- 查詢正在執行的sql語句及該語句執行的時間SQL
- 查詢執行慢的SQL語句SQL
- 查詢正在執行的SQL語句SQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- 查詢sql語句執行次數SQL
- 一條查詢語句的執行流程
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- 查詢Oracle正在執行的SQL語句OracleSQL
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- SQL 查詢語句的執行順序解析SQL
- 查詢orcale執行的SQL語句記錄SQL
- MySQL 查詢語句執行過程淺析MySql
- T-sql語句查詢執行順序SQL
- GaussDB SQL查詢語句執行過程解析SQL
- 一條 SQL 查詢語句是如何執行的?SQL
- SQL Server 查詢歷史執行的SQL語句SQLServer
- MySQL 查詢常用操作(0) —— 查詢語句的執行順序MySql
- 輸入的查詢 SQL 語句,是如何執行的?SQL
- 查詢當前正在執行的SQL語句並KILLSQL
- oracle查詢語句執行計劃中的表消除Oracle
- Oracle 查詢某個session正在執行的sql語句OracleSessionSQL
- mySQL 執行語句執行順序MySql
- SQL語句執行進度檢查SQL
- for語句執行順序
- sql語句批量執行SQL
- FORALL執行DELETE語句delete
- FORALL執行UPDATE語句
- sql語句如何執行的SQL
- 執行大的sql語句SQL
- 面試官:MySQL 是如何執行一條查詢語句的?面試MySql
- Oracle 執行語句歷史查詢—測試和實施人員必備技能Oracle
- MySQL語句執行分析(一)MySql
- MySQL語句執行分析(二)MySql
- SQL語句執行順序SQL
- PHP執行批量mysql語句PHPMySql
- FORALL執行UPDATE語句(二)
- toad執行sql語句SQL
- 小覷資料庫(SqlServer)查詢語句執行過程資料庫SQLServer