Jim M.
Jim M.

Reputation: 1009

JMeter: Dividing dataset between 'users'

I have a Dataset, obtained from a DataBase query, of about 5,000 elements. I would like to divide this data into chunks and then have the 'users' (threads) make a HTTP request.

The purpose of this is we have a site that gives realtime information on transient data, I want to simulate multiple concurrent requests against the service.

1 - Tried to create a test plan where the DB query was done and then processed via a HTTP request via a ForEach controller. This works fine when I have only 1 'user', however; if I increase the user count to 2+ then the DB query is run 2+ times and each 'user' runs through the entire 5,000+ data points

2 - I tried moving the DB query into it's own Thread Group and then using BeanShell to put the data into the environment (props.add(...)). This worked in that the data was there but again each 'user' in the http request Thread Group iterated all the data.

Ideally what I would like is to take the data, and have the HTTP Request Thread Group divide the data so that Thread 1 takes the first 2,500 and that Thread 2 takes the second 2,500 (or if there are 4 'users' then thread 1 takes the first 1,250, thread 2 the next 1,250 and so on).

I just started looking at JMeter and I don't think it can do this "automatically" but I wanted to ask in case I'm missing something obvious.

Upvotes: 0

Views: 440

Answers (2)

Dmitri T
Dmitri T

Reputation: 168082

The fastest and the easiest way is to store the data from the database into a CSV file, once done you should be able to use CSV Data Set Config and its Sharing Mode feature according to your requirements.

The storing of the data could be done as follows:

  1. Define Result variable name in your JDBC Request Sampler:

    enter image description here

  2. Add JSR223 PostProcessor as a child of the JDBC Request sampler
  3. Put the following code into "Script" area:

    resultSet = vars.getObject("resultSet")
    result = new StringBuilder()
    
    for (Object row : resultSet ) {
        iter = row.entrySet().iterator()
        while (iter.hasNext()) {
            pair = iter.next()
            result.append(pair.getValue())
            result.append(",")
        }
        result.append(System.getProperty("line.separator"))
    }
    
    org.apache.commons.io.FileUtils.writeStringToFile(new File("data.csv"), result.toString(), "UTF-8")
    

    Once execution will be finished you should see data.csv file in "bin" folder of your JMeter installation containing the data from the database

Upvotes: 0

v0devil
v0devil

Reputation: 522

Put a Counter element to testplan with:

Starting value: 1

Increment: 1

Reference name: (for example) cid

and disabled "Track counter independently ...".

Then add JSR223 or BeanShell sampler and write a simple code:

Integer cid = Integer.valueOf(vars.get("cid"));
Integer dataShift = 2500;

Integer startReadDataFrom = (cid - 1) * 2500;
vars.put('startReadDataFrom', String.valueOf(startReadDataFrom));

Then you can use variable ${startReadDataFrom} as a starting point to read data for every thread (0, 2500, 5000, 7500, ...).

Upvotes: 1

Related Questions