You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ol...@apache.org on 2003/09/13 14:04:37 UTC

cvs commit: db-ojb/src/test/org/apache/ojb/otm PerformanceTest.java

olegnitz    2003/09/13 05:04:37

  Modified:    src/test/org/apache/ojb/broker PerformanceTest2.java
  Added:       src/test/org/apache/ojb/otm PerformanceTest.java
  Log:
  OTM performance tests added
  
  Revision  Changes    Path
  1.20      +166 -5    db-ojb/src/test/org/apache/ojb/broker/PerformanceTest2.java
  
  Index: PerformanceTest2.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/PerformanceTest2.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- PerformanceTest2.java	30 Jul 2003 21:17:34 -0000	1.19
  +++ PerformanceTest2.java	13 Sep 2003 12:04:37 -0000	1.20
  @@ -9,6 +9,9 @@
   import org.apache.ojb.broker.query.QueryByCriteria;
   import org.apache.ojb.broker.util.ObjectModificationDefaultImpl;
   import org.apache.ojb.odmg.OJB;
  +import org.apache.ojb.otm.OTMConnection;
  +import org.apache.ojb.otm.TestKit;
  +import org.apache.ojb.otm.lock.LockType;
   import org.odmg.DList;
   import org.odmg.Database;
   import org.odmg.Implementation;
  @@ -25,6 +28,7 @@
    */
   public class PerformanceTest2 //extends TestCase
   {
  +    private TestKit _kit;
       private static int iterationsPerThread = 1000;
       private static int concurrentThreads = 10;
       // used for client generated ids
  @@ -50,6 +54,7 @@
       public PerformanceTest2()
       {
           this.threadCount = concurrentThreads;
  +        _kit = TestKit.getTestInstance();
       }
   
       /**
  @@ -139,7 +144,7 @@
           times = new long[4];
           threadCount = concurrentThreads;
   
  -        if (whichTest == 1 || whichTest == 3)
  +        if ((whichTest & 1) == 1)
           {
               PerformanceArticle art = createArticle(1000);
               PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  @@ -153,7 +158,7 @@
               broker.close();
           }
   
  -        if (whichTest == 2 || whichTest == 3)
  +        if ((whichTest & 2) == 2)
           {
               PerformanceArticle art2 = createArticle(1001);
               Implementation ojb = OJB.getInstance();
  @@ -169,6 +174,21 @@
               tx.commit();
               db.close();
           }
  +
  +        if ((whichTest & 4) == 4)
  +        {
  +            PerformanceArticle art3 = createArticle(1002);
  +            OTMConnection conn = _kit.acquireConnection(PersistenceBrokerFactory.getDefaultKey());
  +            org.apache.ojb.otm.core.Transaction tx = _kit.getTransaction(conn);
  +            tx.begin();
  +            conn.makePersistent(art3);
  +            tx.commit();
  +
  +            tx = _kit.getTransaction(conn);
  +            tx.begin();
  +            conn.deletePersistent(art3);
  +            tx.commit();
  +        }
       }
   
       /**
  @@ -228,7 +248,7 @@
               int objectCount = 0;
               int objectCountAfter = 0;
   
  -            if (whichTest == 1 || whichTest == 3)
  +            if ((whichTest & 1) == 1)
               {
                   test.init();
                   objectCount = test.getArticleCount();
  @@ -241,7 +261,7 @@
               }
   
   
  -            if (whichTest == 2 || whichTest == 3)
  +            if ((whichTest & 2) == 2)
               {
                   test.init();
                   objectCount = test.getArticleCount();
  @@ -252,6 +272,18 @@
                   System.err.println("Test-Info:   Objects in DB after ODMG test: " + objectCountAfter);
                   System.err.println("Test-Info:   Stress test was successful? - " + (objectCount == objectCountAfter) + " -");
               }
  +            
  +            if ((whichTest & 4) == 4)
  +            {
  +                test.init();
  +                objectCount = test.getArticleCount();
  +                test.testMultithreaded_OTM_api();
  +
  +                System.err.println("Test-Info:   Objects in DB before OTM test: " + objectCount);
  +                objectCountAfter = test.getArticleCount();
  +                System.err.println("Test-Info:   Objects in DB after OTM test: " + objectCountAfter);
  +                System.err.println("Test-Info:   Stress test was successful? - " + (objectCount == objectCountAfter) + " -");
  +            }
           }
           catch (Exception e)
           {
  @@ -300,6 +332,26 @@
           System.out.println("++ End of performance test ODMG api ++" + sep);
       }
   
  +    public void testMultithreaded_OTM_api()
  +    {
  +        String sep = System.getProperty("line.separator");
  +        System.out.println("++ Start thread generation for OTM api test ++");
  +        System.out.println("Begin with performance test, " + concurrentThreads +
  +                " concurrent threads, handle " + iterationsPerThread + " articles per thread");
  +        PerfomanceTestClientOTM[] clientsOTM = new PerfomanceTestClientOTM[concurrentThreads];
  +        for (int i = 0; i < concurrentThreads; i++)
  +        {
  +            PerfomanceTestClientOTM obj = new PerfomanceTestClientOTM(this);
  +            clientsOTM[i] = obj;
  +        }
  +        System.out.println("");
  +        times[0] = System.currentTimeMillis();
  +        runTestClients(clientsOTM);
  +        times[0] = (long) (System.currentTimeMillis() - times[0]);
  +        System.out.println(buildTestSummary("OTM"));
  +        System.out.println("++ End of performance test OTM api ++" + sep);
  +    }
  +
       private String buildTestSummary(String key)
       {
           String sep = System.getProperty("line.separator");
  @@ -448,6 +500,115 @@
                   PerformanceArticle a = (PerformanceArticle) iter.next();
               }
               db.close();
  +            long stop = System.currentTimeMillis();
  +            times[2] = times[2] + (stop - start);
  +        }
  +    }
  +
  +    /**
  +     * OTM-api test class
  +     */
  +    class PerfomanceTestClientOTM extends TestClient
  +    {
  +        private static final String PRE_NAME = "B_";
  +        private PerformanceArticle[] arr;
  +        private String threadName;
  +        private PerformanceTest2 test;
  +
  +        public PerfomanceTestClientOTM(PerformanceTest2 test)
  +        {
  +            this.test = test;
  +        }
  +
  +        public void run()
  +        {
  +            threadName = Thread.currentThread().toString();
  +            arr = new PerformanceArticle[iterationsPerThread];
  +            for (int i = 0; i < iterationsPerThread; i++)
  +            {
  +                PerformanceArticle a = createArticle(i, threadName);
  +                arr[i] = a;
  +            }
  +
  +            try
  +            {
  +                OTMConnection conn = _kit.acquireConnection(PersistenceBrokerFactory.getDefaultKey());
  +                insertNewArticles(conn);
  +                readArticlesByCursor(conn);
  +                deleteArticles(conn);
  +                conn.close();
  +            }
  +            catch (Throwable e)
  +            {
  +                System.out.println("Error in client " + this);
  +                e.printStackTrace();
  +                test.interruptThreads();
  +            }
  +        }
  +
  +        /**
  +         * factory method that createa an PerformanceArticle
  +         * @return the created PerformanceArticle object
  +         */
  +        private PerformanceArticle createArticle(int id, String name)
  +        {
  +            PerformanceArticle a = new PerformanceArticle();
  +            if (clientKeyGeneration) a.setArticleId(getId());
  +            a.setArticleName(PRE_NAME + name);
  +            a.setMinimumStock(100);
  +            a.setOrderedUnits(17);
  +            a.setPrice(0.45);
  +            a.setProductGroupId(1);
  +            a.setStock(234);
  +            a.setSupplierId(4);
  +            a.setUnit("bottle");
  +            return a;
  +        }
  +
  +        protected void deleteArticles(OTMConnection conn) throws Exception
  +        {
  +            long start = System.currentTimeMillis();
  +            org.apache.ojb.otm.core.Transaction tx = _kit.getTransaction(conn);
  +            tx.begin();
  +            for (int i = 0; i < arr.length; i++)
  +            {
  +                conn.deletePersistent(arr[i]);
  +            }
  +            tx.commit();
  +            long stop = System.currentTimeMillis();
  +            times[3] = times[3] + (stop - start);
  +        }
  +
  +        protected void insertNewArticles(OTMConnection conn) throws Exception
  +        {
  +            long start = System.currentTimeMillis();
  +            org.apache.ojb.otm.core.Transaction tx = _kit.getTransaction(conn);
  +            tx.begin();
  +            for (int i = 0; i < arr.length; i++)
  +            {
  +                conn.makePersistent(arr[i]);
  +            }
  +            tx.commit();
  +            long stop = System.currentTimeMillis();
  +            times[1] = times[1] + (stop - start);
  +        }
  +
  +        protected void readArticlesByCursor(OTMConnection conn) throws Exception
  +        {
  +            long start = System.currentTimeMillis();
  +            int artId = arr[0].articleId;
  +            org.apache.ojb.otm.core.Transaction tx = _kit.getTransaction(conn);
  +            OQLQuery query = conn.newOQLQuery(LockType.NO_LOCK);
  +            String sql = "select allArticles from " + PerformanceArticle.class.getName() +
  +                    " where articleName = \"" + PRE_NAME + threadName + "\"";
  +            query.create(sql);
  +            Iterator iter = conn.getIteratorByOQLQuery(query);
  +            int fetchCount = 0;
  +            while (iter.hasNext())
  +            {
  +                fetchCount++;
  +                PerformanceArticle a = (PerformanceArticle) iter.next();
  +            }
               long stop = System.currentTimeMillis();
               times[2] = times[2] + (stop - start);
           }
  
  
  
  1.1                  db-ojb/src/test/org/apache/ojb/otm/PerformanceTest.java
  
  Index: PerformanceTest.java
  ===================================================================
  package org.apache.ojb.otm;
  
  import java.util.Iterator;
  
  import junit.framework.TestCase;
  import org.apache.ojb.otm.core.Transaction;
  import org.apache.ojb.otm.core.TransactionException;
  import org.apache.ojb.otm.lock.LockType;
  import org.apache.ojb.otm.lock.LockingException;
  import org.apache.ojb.broker.Identity;
  import org.apache.ojb.broker.PerformanceArticle;
  import org.apache.ojb.broker.PersistenceBrokerFactory;
  import org.apache.ojb.broker.util.logging.Logger;
  import org.apache.ojb.broker.util.logging.LoggerFactory;
  import org.odmg.OQLQuery;
  
  /**
   * This TestCase contains the OJB performance benchmarks for the
   * OTM API.
   * @author Oleg Nitz, Matthew Baird, borrowing heavily from Thomas Mahler
   */
  public class PerformanceTest extends TestCase
  {
      private Logger logger = LoggerFactory.getLogger("performance");
  
      private TestKit _kit;
  
      private OTMConnection _conn;
  
      private PerformanceArticle[] arr;
      /**
       * the number of PerformanceArticle objects to work with.
       */
      static int articleCount = 10000;
      /**
       * the number of iterations to perform.
       */
      static int iterations = 2;
      /**
       * the offset value for PerformanceArticle primary keys
       */
      int offsetId = 123456;
  
      public PerformanceTest(String name)
      {
          super(name);
      }
  
      /**
       * launches the TestCase.
       * The number of Objects to work with and the number of iterations
       * to be performed can be adjusted by setting them as commandline parameters.
       * @param args the String[] holding the commandline parameters.
       */
      public static void main(String[] args)
      {
          if (args.length > 0)
          {
              articleCount = Integer.parseInt(args[0]);
          }
          if (args.length > 1)
          {
              iterations = Integer.parseInt(args[1]);
          }
          String[] arr = {PerformanceTest.class.getName()};
          junit.textui.TestRunner.main(arr);
      }
  
      public void setUp()
      {
          _kit = TestKit.getTestInstance();
          _conn = _kit.acquireConnection(PersistenceBrokerFactory.getDefaultKey());
          arr = new PerformanceArticle[articleCount];
          for (int i = 0; i < articleCount; i++)
          {
              PerformanceArticle a = createArticle(offsetId + i);
              arr[i] = a;
          }
      }
  
      public void tearDown()
      {
          _conn.close();
          _conn = null;
      }
  
      /**
       * factory method that createa an PerformanceArticle with a given id.
       * @return the created PerformanceArticle object
       * @param id the primary key value for the new object
       */
      private PerformanceArticle createArticle(int id)
      {
          PerformanceArticle a = new PerformanceArticle();
          a.setArticleId(id);
          a.setArticleName("New Performance Article " + id);
          a.setMinimumStock(100);
          a.setOrderedUnits(17);
          a.setPrice(0.45);
          a.setProductGroupId(1);
          a.setStock(234);
          a.setSupplierId(4);
          a.setUnit("bottle");
          return a;
      }
  
      /**
       * deletes all PerformanceArticle created by <code>insertNewArticles</code>.
       */
      protected void deleteArticles() throws Exception
      {
          long start = System.currentTimeMillis();
          Transaction tx = _kit.getTransaction(_conn);
          tx.begin();
          for (int i = 0; i < articleCount; i++)
          {
              _conn.deletePersistent(arr[i]);
          }
          tx.commit();
          long stop = System.currentTimeMillis();
          logger.info("deleting " + articleCount + " Objects: " + (stop - start) + " msec");
      }
  
      /**
  
       * create new PerformanceArticle objects and insert them into the RDBMS.
  
       * The number of objects to create is defined by <code>articleCount</code>.
  
       */
      protected void insertNewArticles() throws Exception
      {
          long start = System.currentTimeMillis();
          Transaction tx = _kit.getTransaction(_conn);
          tx.begin();
          for (int i = 0; i < articleCount; i++)
          {
              _conn.makePersistent(arr[i]);
          }
          tx.commit();
          long stop = System.currentTimeMillis();
          logger.info("inserting " + articleCount + " Objects: " + (stop - start) + " msec");
      }
  
      /**
       * read in all the PerformanceArticles from the RDBMS that have
       * been inserted by <code>insertNewArticles()</code>.
       * The lookup is done one by one, that is: a primary key based lookup is used.
       */
      protected void readArticles() throws Exception
      {
          long start = System.currentTimeMillis();
          Transaction tx = _kit.getTransaction(_conn);
          tx.begin();
          for (int i = 0; i < articleCount; i++)
          {
              Object[] pks = {new Integer(offsetId + i)};
              Identity oid = new Identity(PerformanceArticle.class, PerformanceArticle.class,pks);
              PerformanceArticle a = (PerformanceArticle) _conn.getObjectByIdentity(oid, LockType.NO_LOCK);
          }
          tx.commit();
          long stop = System.currentTimeMillis();
          logger.info("querying " + articleCount + " Objects: " + (stop - start) + " msec");
      }
  
      /**
       * read in all the PerformanceArticles from the RDBMS that have
       * been inserted by <code>insertNewArticles()</code>.
       * The lookup is done with a cursor fetch,
       * that is: a between Statement is used to select all inserted PerformanceArticles
       * and Objects are read in by fetching from the cursor (JDBC ResultSet).
       */
      protected void readArticlesByCursor() throws Exception
      {
          // clear the cache
          _conn.invalidateAll();
  
          Transaction tx = _kit.getTransaction(_conn);
          OQLQuery query = _conn.newOQLQuery(LockType.NO_LOCK);
          String sql = "select allArticles from " + PerformanceArticle.class.getName() + " where articleId between " + new Integer(offsetId) + " and " + new Integer(offsetId + articleCount);
          query.create(sql);
          long start = System.currentTimeMillis();
          Iterator iter = _conn.getIteratorByOQLQuery(query);
          int fetchCount = 0;
          while (iter.hasNext())
          {
              fetchCount++;
              PerformanceArticle a = (PerformanceArticle) iter.next();
          }
          long stop = System.currentTimeMillis();
          logger.info("fetching " + fetchCount + " Objects: " + (stop - start) + " msec");
      }
  
      /**
       * updates all PerformanceArticles inserted by <code>insertNewArticles()</code>.
       * All objects are modified and changes are written to the RDBMS with an UPDATE.
       */
      protected void updateExistingArticles() throws Exception
      {
          long start = System.currentTimeMillis();
          Transaction tx = _kit.getTransaction(_conn);
          tx.begin();
          // update all objects
          for (int i = 0; i < articleCount; i++)
          {
              _conn.lockForWrite(arr[i]);
              arr[i].setPrice(arr[i].getPrice() * 1.95583);
          }
          tx.commit();
          long stop = System.currentTimeMillis();
          logger.info("updating " + articleCount + " Objects: " + (stop - start) + " msec");
      }
  
      /**
       * this method is the driver for the complete Benchmark.
       * It performs the following steps:
       *
       * 1.) n objects are created and inserted to the RDBMS.
       * 2.) the created objects are modified. Modifications are written to the RDBMS with updates.
       * 3.) All objects created in 1.) are read in by primary key based SELECT statements.
       * 4.) Step 3.) is repeated to test caching facilities.
       * 5.) All objects created in 1.) are read by iterating over a ResultSet.
       * 6.) All objects created in 1.) are deleted with n separate DELETE Statements.
       */
      public void testBenchmark()
      {
          try
          {
              logger.info("Test for OTM-api");
              for (int i = 0; i < iterations; i++)
              {
                  logger.info("");
                  // store all Article objects
                  insertNewArticles();
                  // update all objects
                  updateExistingArticles();
                  // querying with empty cache
                  _conn.invalidateAll();
  
                  readArticles();
                  // querying with hot cache
                  readArticles();
                  // fetching through cursor
                  readArticlesByCursor();
                  // delete all objects
                  deleteArticles();
              }
          }
          catch (Throwable t)
          {
              logger.error(t);
              fail(t.getMessage());
          }
      }
  }
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org


PerformanceTest for OTM

Posted by Armin Waibel <ar...@code-au-lait.de>.
Hi Oleg,

it would be great if you could implement a performance
test for OTM based on the OJB "performance framework"
(better say "base classes for performance testing" ;-)).

Intructions how to implement a performance test you can find
under
http://db.apache.org/ojb/performance.html
section "How OJB compares to other O/R mapping tools?"

The implemenations for JDBC, PB-api and ODMG-api
you can find in class
org.apache.ojb.broker.OJBPerfTest in test suite.
With a few lines of code (and an entry in perf-test ant task)
it's possible to implement a flexible multithreaded
base test for OTM.
What do you think?

regards,
Armin

----- Original Message -----
From: <ol...@apache.org>
To: <db...@apache.org>
Sent: Saturday, September 13, 2003 2:04 PM
Subject: cvs commit: db-ojb/src/test/org/apache/ojb/otm
PerformanceTest.java


> olegnitz    2003/09/13 05:04:37
>
>   Modified:    src/test/org/apache/ojb/broker PerformanceTest2.java
>   Added:       src/test/org/apache/ojb/otm PerformanceTest.java
>   Log:
>   OTM performance tests added
>
>   Revision  Changes    Path
>   1.20      +166 -5
db-ojb/src/test/org/apache/ojb/broker/PerformanceTest2.java
>
>   Index: PerformanceTest2.java
>   ===================================================================
>   RCS file:
/home/cvs/db-ojb/src/test/org/apache/ojb/broker/PerformanceTest2.java,v
>   retrieving revision 1.19
>   retrieving revision 1.20
>   diff -u -r1.19 -r1.20
>   --- PerformanceTest2.java 30 Jul 2003 21:17:34 -0000 1.19
>   +++ PerformanceTest2.java 13 Sep 2003 12:04:37 -0000 1.20
>   @@ -9,6 +9,9 @@
>    import org.apache.ojb.broker.query.QueryByCriteria;
>    import org.apache.ojb.broker.util.ObjectModificationDefaultImpl;
>    import org.apache.ojb.odmg.OJB;
>   +import org.apache.ojb.otm.OTMConnection;
>   +import org.apache.ojb.otm.TestKit;
>   +import org.apache.ojb.otm.lock.LockType;
>    import org.odmg.DList;
>    import org.odmg.Database;
>    import org.odmg.Implementation;
>   @@ -25,6 +28,7 @@
>     */
>    public class PerformanceTest2 file://extends TestCase
>    {
>   +    private TestKit _kit;
>        private static int iterationsPerThread = 1000;
>        private static int concurrentThreads = 10;
>        // used for client generated ids
>   @@ -50,6 +54,7 @@
>        public PerformanceTest2()
>        {
>            this.threadCount = concurrentThreads;
>   +        _kit = TestKit.getTestInstance();
>        }
>
>        /**
>   @@ -139,7 +144,7 @@
>            times = new long[4];
>            threadCount = concurrentThreads;
>
>   -        if (whichTest == 1 || whichTest == 3)
>   +        if ((whichTest & 1) == 1)
>            {
>                PerformanceArticle art = createArticle(1000);
>                PersistenceBroker broker =
PersistenceBrokerFactory.defaultPersistenceBroker();
>   @@ -153,7 +158,7 @@
>                broker.close();
>            }
>
>   -        if (whichTest == 2 || whichTest == 3)
>   +        if ((whichTest & 2) == 2)
>            {
>                PerformanceArticle art2 = createArticle(1001);
>                Implementation ojb = OJB.getInstance();
>   @@ -169,6 +174,21 @@
>                tx.commit();
>                db.close();
>            }
>   +
>   +        if ((whichTest & 4) == 4)
>   +        {
>   +            PerformanceArticle art3 = createArticle(1002);
>   +            OTMConnection conn =
_kit.acquireConnection(PersistenceBrokerFactory.getDefaultKey());
>   +            org.apache.ojb.otm.core.Transaction tx =
_kit.getTransaction(conn);
>   +            tx.begin();
>   +            conn.makePersistent(art3);
>   +            tx.commit();
>   +
>   +            tx = _kit.getTransaction(conn);
>   +            tx.begin();
>   +            conn.deletePersistent(art3);
>   +            tx.commit();
>   +        }
>        }
>
>        /**
>   @@ -228,7 +248,7 @@
>                int objectCount = 0;
>                int objectCountAfter = 0;
>
>   -            if (whichTest == 1 || whichTest == 3)
>   +            if ((whichTest & 1) == 1)
>                {
>                    test.init();
>                    objectCount = test.getArticleCount();
>   @@ -241,7 +261,7 @@
>                }
>
>
>   -            if (whichTest == 2 || whichTest == 3)
>   +            if ((whichTest & 2) == 2)
>                {
>                    test.init();
>                    objectCount = test.getArticleCount();
>   @@ -252,6 +272,18 @@
>                    System.err.println("Test-Info:   Objects in DB
after ODMG test: " + objectCountAfter);
>                    System.err.println("Test-Info:   Stress test was
successful? - " + (objectCount == objectCountAfter) + " -");
>                }
>   +
>   +            if ((whichTest & 4) == 4)
>   +            {
>   +                test.init();
>   +                objectCount = test.getArticleCount();
>   +                test.testMultithreaded_OTM_api();
>   +
>   +                System.err.println("Test-Info:   Objects in DB
before OTM test: " + objectCount);
>   +                objectCountAfter = test.getArticleCount();
>   +                System.err.println("Test-Info:   Objects in DB
after OTM test: " + objectCountAfter);
>   +                System.err.println("Test-Info:   Stress test was
successful? - " + (objectCount == objectCountAfter) + " -");
>   +            }
>            }
>            catch (Exception e)
>            {
>   @@ -300,6 +332,26 @@
>            System.out.println("++ End of performance test ODMG api ++"
+ sep);
>        }
>
>   +    public void testMultithreaded_OTM_api()
>   +    {
>   +        String sep = System.getProperty("line.separator");
>   +        System.out.println("++ Start thread generation for OTM api
test ++");
>   +        System.out.println("Begin with performance test, " +
concurrentThreads +
>   +                " concurrent threads, handle " +
iterationsPerThread + " articles per thread");
>   +        PerfomanceTestClientOTM[] clientsOTM = new
PerfomanceTestClientOTM[concurrentThreads];
>   +        for (int i = 0; i < concurrentThreads; i++)
>   +        {
>   +            PerfomanceTestClientOTM obj = new
PerfomanceTestClientOTM(this);
>   +            clientsOTM[i] = obj;
>   +        }
>   +        System.out.println("");
>   +        times[0] = System.currentTimeMillis();
>   +        runTestClients(clientsOTM);
>   +        times[0] = (long) (System.currentTimeMillis() - times[0]);
>   +        System.out.println(buildTestSummary("OTM"));
>   +        System.out.println("++ End of performance test OTM api ++"
+ sep);
>   +    }
>   +
>        private String buildTestSummary(String key)
>        {
>            String sep = System.getProperty("line.separator");
>   @@ -448,6 +500,115 @@
>                    PerformanceArticle a = (PerformanceArticle)
iter.next();
>                }
>                db.close();
>   +            long stop = System.currentTimeMillis();
>   +            times[2] = times[2] + (stop - start);
>   +        }
>   +    }
>   +
>   +    /**
>   +     * OTM-api test class
>   +     */
>   +    class PerfomanceTestClientOTM extends TestClient
>   +    {
>   +        private static final String PRE_NAME = "B_";
>   +        private PerformanceArticle[] arr;
>   +        private String threadName;
>   +        private PerformanceTest2 test;
>   +
>   +        public PerfomanceTestClientOTM(PerformanceTest2 test)
>   +        {
>   +            this.test = test;
>   +        }
>   +
>   +        public void run()
>   +        {
>   +            threadName = Thread.currentThread().toString();
>   +            arr = new PerformanceArticle[iterationsPerThread];
>   +            for (int i = 0; i < iterationsPerThread; i++)
>   +            {
>   +                PerformanceArticle a = createArticle(i,
threadName);
>   +                arr[i] = a;
>   +            }
>   +
>   +            try
>   +            {
>   +                OTMConnection conn =
_kit.acquireConnection(PersistenceBrokerFactory.getDefaultKey());
>   +                insertNewArticles(conn);
>   +                readArticlesByCursor(conn);
>   +                deleteArticles(conn);
>   +                conn.close();
>   +            }
>   +            catch (Throwable e)
>   +            {
>   +                System.out.println("Error in client " + this);
>   +                e.printStackTrace();
>   +                test.interruptThreads();
>   +            }
>   +        }
>   +
>   +        /**
>   +         * factory method that createa an PerformanceArticle
>   +         * @return the created PerformanceArticle object
>   +         */
>   +        private PerformanceArticle createArticle(int id, String
name)
>   +        {
>   +            PerformanceArticle a = new PerformanceArticle();
>   +            if (clientKeyGeneration) a.setArticleId(getId());
>   +            a.setArticleName(PRE_NAME + name);
>   +            a.setMinimumStock(100);
>   +            a.setOrderedUnits(17);
>   +            a.setPrice(0.45);
>   +            a.setProductGroupId(1);
>   +            a.setStock(234);
>   +            a.setSupplierId(4);
>   +            a.setUnit("bottle");
>   +            return a;
>   +        }
>   +
>   +        protected void deleteArticles(OTMConnection conn) throws
Exception
>   +        {
>   +            long start = System.currentTimeMillis();
>   +            org.apache.ojb.otm.core.Transaction tx =
_kit.getTransaction(conn);
>   +            tx.begin();
>   +            for (int i = 0; i < arr.length; i++)
>   +            {
>   +                conn.deletePersistent(arr[i]);
>   +            }
>   +            tx.commit();
>   +            long stop = System.currentTimeMillis();
>   +            times[3] = times[3] + (stop - start);
>   +        }
>   +
>   +        protected void insertNewArticles(OTMConnection conn) throws
Exception
>   +        {
>   +            long start = System.currentTimeMillis();
>   +            org.apache.ojb.otm.core.Transaction tx =
_kit.getTransaction(conn);
>   +            tx.begin();
>   +            for (int i = 0; i < arr.length; i++)
>   +            {
>   +                conn.makePersistent(arr[i]);
>   +            }
>   +            tx.commit();
>   +            long stop = System.currentTimeMillis();
>   +            times[1] = times[1] + (stop - start);
>   +        }
>   +
>   +        protected void readArticlesByCursor(OTMConnection conn)
throws Exception
>   +        {
>   +            long start = System.currentTimeMillis();
>   +            int artId = arr[0].articleId;
>   +            org.apache.ojb.otm.core.Transaction tx =
_kit.getTransaction(conn);
>   +            OQLQuery query = conn.newOQLQuery(LockType.NO_LOCK);
>   +            String sql = "select allArticles from " +
PerformanceArticle.class.getName() +
>   +                    " where articleName = \"" + PRE_NAME +
threadName + "\"";
>   +            query.create(sql);
>   +            Iterator iter = conn.getIteratorByOQLQuery(query);
>   +            int fetchCount = 0;
>   +            while (iter.hasNext())
>   +            {
>   +                fetchCount++;
>   +                PerformanceArticle a = (PerformanceArticle)
iter.next();
>   +            }
>                long stop = System.currentTimeMillis();
>                times[2] = times[2] + (stop - start);
>            }
>
>
>
>   1.1
db-ojb/src/test/org/apache/ojb/otm/PerformanceTest.java
>
>   Index: PerformanceTest.java
>   ===================================================================
>   package org.apache.ojb.otm;
>
>   import java.util.Iterator;
>
>   import junit.framework.TestCase;
>   import org.apache.ojb.otm.core.Transaction;
>   import org.apache.ojb.otm.core.TransactionException;
>   import org.apache.ojb.otm.lock.LockType;
>   import org.apache.ojb.otm.lock.LockingException;
>   import org.apache.ojb.broker.Identity;
>   import org.apache.ojb.broker.PerformanceArticle;
>   import org.apache.ojb.broker.PersistenceBrokerFactory;
>   import org.apache.ojb.broker.util.logging.Logger;
>   import org.apache.ojb.broker.util.logging.LoggerFactory;
>   import org.odmg.OQLQuery;
>
>   /**
>    * This TestCase contains the OJB performance benchmarks for the
>    * OTM API.
>    * @author Oleg Nitz, Matthew Baird, borrowing heavily from Thomas
Mahler
>    */
>   public class PerformanceTest extends TestCase
>   {
>       private Logger logger = LoggerFactory.getLogger("performance");
>
>       private TestKit _kit;
>
>       private OTMConnection _conn;
>
>       private PerformanceArticle[] arr;
>       /**
>        * the number of PerformanceArticle objects to work with.
>        */
>       static int articleCount = 10000;
>       /**
>        * the number of iterations to perform.
>        */
>       static int iterations = 2;
>       /**
>        * the offset value for PerformanceArticle primary keys
>        */
>       int offsetId = 123456;
>
>       public PerformanceTest(String name)
>       {
>           super(name);
>       }
>
>       /**
>        * launches the TestCase.
>        * The number of Objects to work with and the number of
iterations
>        * to be performed can be adjusted by setting them as
commandline parameters.
>        * @param args the String[] holding the commandline parameters.
>        */
>       public static void main(String[] args)
>       {
>           if (args.length > 0)
>           {
>               articleCount = Integer.parseInt(args[0]);
>           }
>           if (args.length > 1)
>           {
>               iterations = Integer.parseInt(args[1]);
>           }
>           String[] arr = {PerformanceTest.class.getName()};
>           junit.textui.TestRunner.main(arr);
>       }
>
>       public void setUp()
>       {
>           _kit = TestKit.getTestInstance();
>           _conn =
_kit.acquireConnection(PersistenceBrokerFactory.getDefaultKey());
>           arr = new PerformanceArticle[articleCount];
>           for (int i = 0; i < articleCount; i++)
>           {
>               PerformanceArticle a = createArticle(offsetId + i);
>               arr[i] = a;
>           }
>       }
>
>       public void tearDown()
>       {
>           _conn.close();
>           _conn = null;
>       }
>
>       /**
>        * factory method that createa an PerformanceArticle with a
given id.
>        * @return the created PerformanceArticle object
>        * @param id the primary key value for the new object
>        */
>       private PerformanceArticle createArticle(int id)
>       {
>           PerformanceArticle a = new PerformanceArticle();
>           a.setArticleId(id);
>           a.setArticleName("New Performance Article " + id);
>           a.setMinimumStock(100);
>           a.setOrderedUnits(17);
>           a.setPrice(0.45);
>           a.setProductGroupId(1);
>           a.setStock(234);
>           a.setSupplierId(4);
>           a.setUnit("bottle");
>           return a;
>       }
>
>       /**
>        * deletes all PerformanceArticle created by
<code>insertNewArticles</code>.
>        */
>       protected void deleteArticles() throws Exception
>       {
>           long start = System.currentTimeMillis();
>           Transaction tx = _kit.getTransaction(_conn);
>           tx.begin();
>           for (int i = 0; i < articleCount; i++)
>           {
>               _conn.deletePersistent(arr[i]);
>           }
>           tx.commit();
>           long stop = System.currentTimeMillis();
>           logger.info("deleting " + articleCount + " Objects: " +
(stop - start) + " msec");
>       }
>
>       /**
>
>        * create new PerformanceArticle objects and insert them into
the RDBMS.
>
>        * The number of objects to create is defined by
<code>articleCount</code>.
>
>        */
>       protected void insertNewArticles() throws Exception
>       {
>           long start = System.currentTimeMillis();
>           Transaction tx = _kit.getTransaction(_conn);
>           tx.begin();
>           for (int i = 0; i < articleCount; i++)
>           {
>               _conn.makePersistent(arr[i]);
>           }
>           tx.commit();
>           long stop = System.currentTimeMillis();
>           logger.info("inserting " + articleCount + " Objects: " +
(stop - start) + " msec");
>       }
>
>       /**
>        * read in all the PerformanceArticles from the RDBMS that have
>        * been inserted by <code>insertNewArticles()</code>.
>        * The lookup is done one by one, that is: a primary key based
lookup is used.
>        */
>       protected void readArticles() throws Exception
>       {
>           long start = System.currentTimeMillis();
>           Transaction tx = _kit.getTransaction(_conn);
>           tx.begin();
>           for (int i = 0; i < articleCount; i++)
>           {
>               Object[] pks = {new Integer(offsetId + i)};
>               Identity oid = new Identity(PerformanceArticle.class,
PerformanceArticle.class,pks);
>               PerformanceArticle a = (PerformanceArticle)
_conn.getObjectByIdentity(oid, LockType.NO_LOCK);
>           }
>           tx.commit();
>           long stop = System.currentTimeMillis();
>           logger.info("querying " + articleCount + " Objects: " +
(stop - start) + " msec");
>       }
>
>       /**
>        * read in all the PerformanceArticles from the RDBMS that have
>        * been inserted by <code>insertNewArticles()</code>.
>        * The lookup is done with a cursor fetch,
>        * that is: a between Statement is used to select all inserted
PerformanceArticles
>        * and Objects are read in by fetching from the cursor (JDBC
ResultSet).
>        */
>       protected void readArticlesByCursor() throws Exception
>       {
>           // clear the cache
>           _conn.invalidateAll();
>
>           Transaction tx = _kit.getTransaction(_conn);
>           OQLQuery query = _conn.newOQLQuery(LockType.NO_LOCK);
>           String sql = "select allArticles from " +
PerformanceArticle.class.getName() + " where articleId between " + new
Integer(offsetId) + " and " + new Integer(offsetId + articleCount);
>           query.create(sql);
>           long start = System.currentTimeMillis();
>           Iterator iter = _conn.getIteratorByOQLQuery(query);
>           int fetchCount = 0;
>           while (iter.hasNext())
>           {
>               fetchCount++;
>               PerformanceArticle a = (PerformanceArticle) iter.next();
>           }
>           long stop = System.currentTimeMillis();
>           logger.info("fetching " + fetchCount + " Objects: " +
(stop - start) + " msec");
>       }
>
>       /**
>        * updates all PerformanceArticles inserted by
<code>insertNewArticles()</code>.
>        * All objects are modified and changes are written to the RDBMS
with an UPDATE.
>        */
>       protected void updateExistingArticles() throws Exception
>       {
>           long start = System.currentTimeMillis();
>           Transaction tx = _kit.getTransaction(_conn);
>           tx.begin();
>           // update all objects
>           for (int i = 0; i < articleCount; i++)
>           {
>               _conn.lockForWrite(arr[i]);
>               arr[i].setPrice(arr[i].getPrice() * 1.95583);
>           }
>           tx.commit();
>           long stop = System.currentTimeMillis();
>           logger.info("updating " + articleCount + " Objects: " +
(stop - start) + " msec");
>       }
>
>       /**
>        * this method is the driver for the complete Benchmark.
>        * It performs the following steps:
>        *
>        * 1.) n objects are created and inserted to the RDBMS.
>        * 2.) the created objects are modified. Modifications are
written to the RDBMS with updates.
>        * 3.) All objects created in 1.) are read in by primary key
based SELECT statements.
>        * 4.) Step 3.) is repeated to test caching facilities.
>        * 5.) All objects created in 1.) are read by iterating over a
ResultSet.
>        * 6.) All objects created in 1.) are deleted with n separate
DELETE Statements.
>        */
>       public void testBenchmark()
>       {
>           try
>           {
>               logger.info("Test for OTM-api");
>               for (int i = 0; i < iterations; i++)
>               {
>                   logger.info("");
>                   // store all Article objects
>                   insertNewArticles();
>                   // update all objects
>                   updateExistingArticles();
>                   // querying with empty cache
>                   _conn.invalidateAll();
>
>                   readArticles();
>                   // querying with hot cache
>                   readArticles();
>                   // fetching through cursor
>                   readArticlesByCursor();
>                   // delete all objects
>                   deleteArticles();
>               }
>           }
>           catch (Throwable t)
>           {
>               logger.error(t);
>               fail(t.getMessage());
>           }
>       }
>   }
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
> For additional commands, e-mail: ojb-dev-help@db.apache.org
>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org