package org.prevayler.demos.scalability; /** * Tests insert, update and delete scalability. */ public class TransactionTestRun extends ScalabilityTestRun { private int halfTheObjects; public TransactionTestRun( ScalabilityTestSubject subject, int numberOfObjects, int minThreads, int maxThreads){ super(subject,numberOfObjects,minThreads,maxThreads); } protected String name(){ return "Transaction Test"; } protected void prepare(){ super.prepare(); halfTheObjects=numberOfObjects / 2; } /** * Deletes records from id zero to id halfTheObjects - 1. * Updates records from id halfTheObjects to id numberOfObjects - 1. * Inserts records from id numberOfObjects to id numberOfObjects + halfTheObjects - 1. * Every time halfTheObjects operations have completed, all ranges are shifted up by halfTheObjects. * Example for one million objects: * Deletes records from id 0000000 to id 0499999. * Updates records from id 0500000 to id 0999999. * Inserts records from id 1000000 to id 1499999. * Every time 500000 operations have completed, all ranges are shifted up by 500000. */ protected void executeOperation( Object connection, long operationSequence){ Record recordToInsert=new Record(numberOfObjects + operationSequence); long idToDelete=spreadId(operationSequence); Record recordToUpdate=new Record(halfTheObjects + idToDelete); ((TransactionConnection)connection).performTransaction(recordToInsert,recordToUpdate,idToDelete); } /** * Spreads out the id values so that deletes and updates are not done contiguously. */ private long spreadId( long id){ return (id / halfTheObjects) * halfTheObjects + ((id * 16807) % halfTheObjects); } }