用JMeter測試monggodb的請求


JMeter測試MongoDB性能有兩種方式,一種是利用JMeter直接測試MongoDB【即通過MongoDB協議測試】,另一種是寫Java代碼方式測試MongoDB【即通過java請求測試】

注:

  1、用於插件不准,所以在使用JMeter直接測試MongoDB時例如find()、insert()等命令返回結果會不准,因此3.0里去掉了mongodb的協議,如果要用JMeter測試MongoDB我們一般選擇寫Java代碼的方式【即第二種方式】,具體情況會在后面說明。

  2、JMeter2.10、JMeter2.11版本里有mongodb協議,3.0里無mongodb協議,如果想使用該協議注意JMeter版本的選擇

 

第一種JMeter直接進行測試MongoDB

1.啟動JMeter,新建線程組,設置線程組屬性

2.右鍵添加-MongoDB Source Config

3.右鍵添加-Sampler-MongoDB Script

4.右鍵-監聽器-察看結果樹

可以看出JMeter測試count()命令結果和mongodb查詢結果一直,但是JMeter由於插件不准,有的命令不准,例如find()、insert()命令,具體如下:

insert命令測試:

 insert測試結果:

 會發現雖然請求發送成功了,但是返回的結果是一串很長的字符串,很難確定插入是否成功,通過客戶端查詢,數據已插入成功;JMeter直接錄入db.foo.find()和insert()命令響應結果相似,響應結果也是一串類似字符串,而不是數據結果,所以我們一般不用該種方法測試mongodb,具體如下圖:

 

第二種JMeter結合Java代碼測試MongoDB

1.編寫Java代碼,內容如下:

package com.test.mongodb;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicLong;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoOptions;
import com.mongodb.ServerAddress;
import com.mongodb.WriteResult;

public class TestMongodb extends AbstractJavaSamplerClient{
    private static Mongo m;  
    private static DB db;  
   // private static AtomicLong read_key = new AtomicLong(0);  
    //private static FileOutputStream fos;  
    static {  
        try {  
            //MongoDB連接池配置
            //fos = new FileOutputStream(new File("jmeter_error.log"));  
            MongoOptions options = new MongoOptions();  
            //options.autoConnectRetry = true;  
            options.connectionsPerHost = 1000;  
            options.maxWaitTime = 5000;  
            options.socketTimeout = 0;  
            options.connectTimeout = 15000;  
            options.threadsAllowedToBlockForConnectionMultiplier = 5000;  
            m = new Mongo(new ServerAddress("127.0.0.1", 27017), options);  
            db = m.getDB("myTest");  //獲取myTest數據庫 
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    public Arguments getDefaultParameters() {
        Arguments params = new Arguments();
        params.addArgument("rw", "w");
        return params;
    }
    
    public SampleResult runTest(JavaSamplerContext context) {  
        // System.out.println(read_key.getAndIncrement());  
        SampleResult results = new SampleResult();  
        //System.out.println(context.getParameter("rw"));  
        results.sampleStart();
      //1、獲取一個集合foo
        DBCollection coll = db.getCollection("foo"); //獲取一個集合foo 
      //2、對集合foo進行插入操作
        if ("w".equalsIgnoreCase(context.getParameter("rw"))) {  
           // long key = 1;  
            //2.1 構造一個文檔doc
            BasicDBObject doc = new BasicDBObject(); 
            //2.2 向文檔中放入數據
            doc.put("_id", UUID.randomUUID());  
            doc.put("_class", "com.iflashbuy.bi.source.pojo.AreaDataEntity");  
            doc.put("province", "廣東");  
            doc.put("city", "廣州");  
            doc.put("pv", 35522924);  
            doc.put("uv", 52556);  
            doc.put("orderCount", 963);  
            doc.put("orderTotal", 1548563);  
            doc.put("entpriseCode", "00540001");  
            //2.3 將文檔插入到集合foo中
            coll.insert(doc);
        }  

        results.setSuccessful(true);  
        results.sampleEnd();  
        return results;  
    }  
    
    /*public static void main(String args[]) throws Exception {  
        Arguments a = new Arguments();  
        a.addArgument("rw", "w");  
        final JavaSamplerContext c = new JavaSamplerContext(a);  
        long startTime = System.currentTimeMillis();  
        for (int i = 0; i < 5; i++) {  
            new Thread() {  
                public void run() {  
                    TestMongodb t = new TestMongodb();  
                    for (int j = 0; j < 2; j++) {  
                        t.runTest(c);  
                    }  
                }  
            }.start();  
        } 
        long endTime = System.currentTimeMillis(); 
        System.out.println(endTime-startTime);
    } */ 
    
}  

注:在編寫java代碼時要引入幾個包,如圖

2.生成jar包,放在Jmeter_HOME/lib/ext文件夾下

3.啟動JMeter,新建線程組,Java請求,察看結果樹,聚合報告

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM