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 ar...@apache.org on 2003/02/07 11:58:41 UTC

cvs commit: db-ojb/src/test/org/apache/ojb/broker PerformanceTest2.java OJBPerfTest.java

arminw      2003/02/07 02:58:40

  Modified:    xdocs    performance.xml
               src/test/org/apache/ojb/performance PerfTest.java
                        PerfMain.java PerfHandle.java
               src/test/org/apache/ojb/broker PerformanceTest2.java
                        OJBPerfTest.java
  Log:
  update performance package,
  restore Performance2 version 1.12
  
  Revision  Changes    Path
  1.7       +53 -36    db-ojb/xdocs/performance.xml
  
  Index: performance.xml
  ===================================================================
  RCS file: /home/cvs/db-ojb/xdocs/performance.xml,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- performance.xml	6 Feb 2003 01:25:18 -0000	1.6
  +++ performance.xml	7 Feb 2003 10:58:35 -0000	1.7
  @@ -54,7 +54,9 @@
   use an O/R tool for a specific software system.
   </p>
   <p>
  -This document describes the <i>OJB Performance Test Suite</i>.
  +This document describes the <i>OJB Performance Test Suite</i>
  +which was created to lighten the decision between native JDBC,
  +OJB and other O/R mapper.
   </p>
   </subsection>
   
  @@ -86,11 +88,22 @@
   or if native JDBC programming should be used for performance reasons.
   </p>
   <p>
  +Take care of compareable configuration properties when run
  +performance tests with different O/R tools.
  +</p>
  +<p>
   If the decision made to use an O/R mapping tool the comparison with
   other tools helps to find the best one for the thought scenario.
   <br/>
  -But performance should not be the only reason to take a specific
  -O/R tool.
  +But performance shouldn't be the only reason to take a specific
  +O/R tool. There are many other points to consider:
  +<br/>- Usability of the supported API's
  +<br/>- Flexibility of the framework
  +<br/>- Scalability of the framework
  +<br/>- Community support
  +<br/>- The different licences of Open Source projects
  +<br/>- etcetera ...
  +
   
   <font color="#ff0000"><i><b>
   bla bla TODO
  @@ -171,12 +184,21 @@
   
   <subsection name="OJB performance in multi-threaded environments" anchor="5">
   
  -<font color="#ff0000"><i><b>
  -TODO
  -</b></i></font>
  +<p>
  +This test was created to check the performance and stability of the
  +supported API's (PB-api, ODMG-api, JDO-api) in a multithreaded environment.
  +Running this test out of the box (a virgin OJB version) shouldn't cause any problems.
  +To run the JDO-api test too, see <a href="tutorial4.html">JDO tutorial</a> and comment in
  +the test in target <code>perf-test</code> in <code>build.xml</code>.
  +</p>
  +<p>
  +Per default OJB use hsql as database, by changing the JdbcConnectionDescriptor
  +in the repository.xml file you can point to your specific RDBMS. Please
  +refer to this <a href="platforms.html">document for details</a>.
  +</p>
   
   <p>
  -To test the performance of OJB in an multithreaded environment call
  +To run the multithreaded performance test call
   <code>bin\build.bat perf-test</code> or
   <code>bin/build.sh perf-test</code>.
   </p>
  @@ -184,31 +206,19 @@
   <p>
   A typical output of this test looks like:
   <source>
  - [ojb] ----------------------------------------------------
  - [ojb] TEST SUMMARY - ODMG
  - [ojb] ----------------------------------------------------
  - [ojb] 10 concurrent threads, handle 2000 articles per thread
  - [ojb] Test period: 46.72 [sec]
  - [ojb] Inserting period: 25878 [msec]
  - [ojb] Fetching period: 6551 [msec]
  - [ojb] Deleting period: 10725 [msec]
  -
  - [ojb] Test was successful
  - [ojb] ----------------------------------------------------
  -
  - [ojb] ----------------------------------------------------
  - [ojb] TEST SUMMARY - PB
  - [ojb] ----------------------------------------------------
  - [ojb] 10 concurrent threads, handle 2000 articles per thread
  - [ojb] Test period: 16.697 [sec]
  - [ojb] Inserting period: 11731 [msec]
  - [ojb] Fetching period: 162 [msec]
  - [ojb] Deleting period: 2247 [msec]
  -
  - [ojb] Test was successful
  - [ojb] ----------------------------------------------------
  +[ojb] =================================================================
  +[ojb]              OJB PERFORMANCE TEST SUMMARY
  +[ojb] 10 concurrent threads, handle 2000 articles per thread
  +[ojb]              - performance mode
  +[ojb] =================================================================
  +[ojb]           API  Test Period       Insert        Fetch       Delete
  +[ojb]                      [sec]       [msec]       [msec]       [msec]
  +[ojb] -----------------------------------------------------------------
  +[ojb]          ODMG       46.083        25654         6204         8303
  +[ojb]            PB       16.811        11864          175         2317
  +[ojb] =================================================================
   
  - [ojb] PerfTest takes 201 [sec]
  +[ojb] PerfTest takes 200 [sec]
   </source>
   </p>
   <p>
  @@ -216,12 +226,13 @@
   in the <code>build.xml</code> file and change the program parameter.
   <br/>
   The test needs five parameter:
  -<br/>- A comma separated list of the test implementation classes
  +<br/>- A comma separated list of the test implementation classes (no blanks!)
   <br/>- The number of test loops
   <br/>- The number of concurrent threads
   <br/>- The number of managed objects per thread
   <br/>- The desired test mode. <code>false</code> means run in
  -performance mode, <code>true</code> means run in stress mode.
  +performance mode, <code>true</code> means run in stress mode
  +(useful for developer to check stability).
   </p>
   </subsection>
   
  @@ -229,12 +240,18 @@
   
   
   <subsection name="How OJB compares to other O/R mapping tools?" anchor="6">
  -<p>
   
   <font color="#ff0000"><i><b>
   TODO
   </b></i></font>
   
  +<p>
  +Many user ask this question and we don't know the answer. But OJB was
  +shipped with a simple performance framework which allows a rudimentarily
  +comparision of the OJB with other (java-based) O/R mapping tools.
  +<br/>
  +Call <code>bin\build.bat perf-test-jar</code> or <code>bin/build.sh perf-test-jar</code>
  +to build the jar file contain all necessary classes.
   </p>
   </subsection>
   
  @@ -242,15 +259,15 @@
   
   
   <subsection name="Using OJB to write clean JDBC code" anchor="6">
  -<p>
   
   <font color="#ff0000"><i><b>
   TODO
   </b></i></font>
   
  +<p>
  +
   </p>
   </subsection>
  -
   
   </section>
   </body>
  
  
  
  1.2       +3 -3      db-ojb/src/test/org/apache/ojb/performance/PerfTest.java
  
  Index: PerfTest.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/performance/PerfTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PerfTest.java	6 Feb 2003 01:20:54 -0000	1.1
  +++ PerfTest.java	7 Feb 2003 10:58:40 -0000	1.2
  @@ -46,7 +46,7 @@
       public abstract PerfHandle newPerfHandle(PerfTest test);
   
       /**
  -     * Returns the count of all found {@link PerformanceArticle}
  +     * Returns the count of all found {@link PerfArticle}
        * in database. Do not use the cache to get the count!
        */
       public abstract int articleCount();
  @@ -55,7 +55,7 @@
       private void checkApi() throws Exception
       {
           PerfHandle handle = newPerfHandle(this);
  -        PerfArticle article = handle.newPerfArticle(testName());
  +        PerfArticle article = handle.getPreparedPerfArticle(testName());
           PerfArticle[] arr = new PerfArticle[]{article};
           handle.init();
           handle.insertNewArticles(arr);
  
  
  
  1.2       +150 -66   db-ojb/src/test/org/apache/ojb/performance/PerfMain.java
  
  Index: PerfMain.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/performance/PerfMain.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PerfMain.java	6 Feb 2003 01:20:54 -0000	1.1
  +++ PerfMain.java	7 Feb 2003 10:58:40 -0000	1.2
  @@ -12,43 +12,36 @@
   import java.util.StringTokenizer;
   
   /**
  - * The OJB stress/performance test - a small performance test framework for
  + * The OJB stress/performance test - a simple performance test framework for
    * testing multi-threaded environments.
    *
  - *
  - *
  - *
  - *
  - *
  - *
    * <p>
    * <b>You have two possibilities to run this test:</b>
    * <p>
    * - use the build script and call
    * <br/>
  - * <code>bin/build.sh performance2</code>
  + * <code>bin/build.sh perf-test</code>
    * or
    * <br/>
  - * <code>bin\build.bat performance2</code>
  + * <code>bin\build.bat perf-test</code>
    * </p>
    * <p>
    * - or perform the test class by yourself
    * <br/>
    * <code>
  - * java -classpath .... MyPerfTest.class 10 2000 false 3 2 true
  + * java -classpath CLASSPATH org.apache.ojb.performance.PerfMain
  + * [comma separated list of PerfTest implementation classes, no blanks!]
  + * [number of test loops]
  + * [number of threads]
  + * [number of insert/fetch/delete loops per thread]
  + * [boolean - run in stress mode if set true, run in performance mode if set false, default false]
    * </code>
    * <br/>
  - * The programm parameter are in order of use:
  - * <ul>
  - * <li>number of concurrent threads</li>
  - * <li>number of handled objects per thread</li>
  - * <li><code>true</code> client side id generation </li>
  - * <li>chose the api: <i>1</i> PB-api test, <i>2</i> ODMG-api test, <i>3</i> both api tests</li>
  - * <li>number of test loops</li>
  - * <li><code>true</code> use a special stress mode (useful for development)</li>
  - * </ul>
  - * </p>
  + * For example:
  + * <br/>
  + * <code>java -classpath CLASSPATH my.MyPerfTest,myMyPerfTest2 3 10 2000 fale</code>
    * </p>
  + *
    * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>
    * @version $Id$
    */
  @@ -74,7 +67,7 @@
        */
       private static int testLoops = 1;
   
  -    private Map resultMap;
  +    private HashMap resultMap;
       private Map exceptionMap;
   
   
  @@ -206,50 +199,130 @@
               print.println(buf.toString());
           }
   
  -        Iterator it = resultMap.values().iterator();
  -        while (it.hasNext())
  -        {
  -            PerfResult result = (PerfResult) it.next();
  -            print.println(buildTestSummary(result));
  -        }
  +        print.println(buildTestSummary(resultMap.values()));
  +
  +//        Iterator it = resultMap.values().iterator();
  +//        while (it.hasNext())
  +//        {
  +//            PerfResult result = (PerfResult) it.next();
  +//            print.println(buildTestSummary(result));
  +//        }
       }
   
  -    private String buildTestSummary(PerfResult result)
  +    private String buildTestSummary(Collection results)
       {
  -        String sep = System.getProperty("line.separator");
  +        int column = 13;
           StringBuffer buf = new StringBuffer();
  -        buf.append(sep);
  -        buf.append("----------------------------------------------------");
  -        buf.append(sep);
  -        buf.append("TEST SUMMARY - " + result.getTestName());
  -        buf.append(sep);
  -        buf.append("----------------------------------------------------");
  -        buf.append(sep);
  -        buf.append(PerfMain.getConcurrentThreads() + " concurrent threads, handle " + PerfMain.getIterationsPerThread() + " articles per thread");
  -        buf.append(sep);
  -        buf.append("Test period: " + (double) (((double) result.getTestPeriod()) / 1000) + " [sec]");
  -        buf.append(sep);
  -        buf.append("Inserting period: " + result.getInsertPeriod() + " [msec]");
  -        buf.append(sep);
  -        buf.append("Fetching period: " + result.getFetchPeriod() + " [msec]");
  -        buf.append(sep);
  -        buf.append("Deleting period: " + result.getDeletePeriod() + " [msec]");
  -        buf.append(sep);
  -
  -        if (result.isValid())
  +        // table header
  +        buf.append(EOL);
  +        for(int i=0;i<5;i++)
  +        {
  +            buf.append(getFilledUpToLength("", column, "="));
  +        }
  +        buf.append(EOL);
  +        buf.append(getFilledUpToLength("", column, " "));
  +        buf.append(getFilledUpToLength("OJB PERFORMANCE TEST SUMMARY", column, " "));
  +        buf.append(EOL);
  +
  +        buf.append(PerfMain.getConcurrentThreads() + " concurrent threads, handle " +
  +                PerfMain.getIterationsPerThread() + " objects per thread");
  +        buf.append(EOL);
  +        buf.append(getFilledUpToLength("", column, " "));
  +        buf.append("- " + (isUseStressMode()==false ? "performance mode" : "stress mode -"));
  +        buf.append(EOL);
  +        for(int i=0;i<5;i++)
           {
  -            buf.append(sep + "Test was successful" + sep);
  +            buf.append(getFilledUpToLength("", column, "="));
           }
  -        else
  +        buf.append(EOL);
  +        buf.append(getFilledUpToLength("API", column, " "));
  +        buf.append(getFilledUpToLength("Test Period", column, " "));
  +        buf.append(getFilledUpToLength("Insert", column, " "));
  +        buf.append(getFilledUpToLength("Fetch", column, " "));
  +        buf.append(getFilledUpToLength("Delete", column, " "));
  +        buf.append(EOL);
  +        buf.append(getFilledUpToLength("", column, " "));
  +        buf.append(getFilledUpToLength("[sec]", column, " "));
  +        buf.append(getFilledUpToLength("[msec]", column, " "));
  +        buf.append(getFilledUpToLength("[msec]", column, " "));
  +        buf.append(getFilledUpToLength("[msec]", column, " "));
  +        buf.append(EOL);
  +        for(int i=0;i<5;i++)
           {
  -            buf.append(sep + buildObjectBeforeAfterList(result.consistentList) + sep);
  +            buf.append(getFilledUpToLength("", column, "-"));
           }
   
  -        buf.append("----------------------------------------------------");
  -
  +        // fill table
  +        Iterator it = results.iterator();
  +        while(it.hasNext())
  +        {
  +            buf.append(EOL);
  +            PerfResult res = (PerfResult) it.next();
  +            buf.append(getFilledUpToLength(res.getTestName(), column, " "));
  +            buf.append(getFilledUpToLength(new Double((double) (((double) res.getTestPeriod()) / 1000)).toString(), column, " "));
  +            buf.append(getFilledUpToLength(new Long(res.getInsertPeriod()).toString(), column, " "));
  +            buf.append(getFilledUpToLength(new Long(res.getFetchPeriod()).toString(), column, " "));
  +            buf.append(getFilledUpToLength(new Long(res.getDeletePeriod()).toString(), column, " "));
  +        }
  +        buf.append(EOL);
  +        for(int i=0;i<5;i++)
  +        {
  +            buf.append(getFilledUpToLength("", column, "="));
  +        }
           return buf.toString();
       }
   
  +    private String getFilledUpToLength(String target, int length, String fillCharacter)
  +    {
  +        if(target.length() > length) return target;
  +
  +        int count = length - target.length();
  +        String blanks = "";
  +        for(int i=0;i<count;i++)
  +        {
  +            blanks = blanks + fillCharacter;
  +        }
  +        return blanks + target;
  +    }
  +
  +//    private String buildTestSummary(PerfResult result)
  +//    {
  +//        String EOL = System.getProperty("line.separator");
  +//        StringBuffer buf = new StringBuffer();
  +//        buf.append(EOL);
  +//        buf.append("----------------------------------------------------");
  +//        buf.append(EOL);
  +//        buf.append("TEST SUMMARY - " + result.getTestName());
  +//        buf.append(EOL);
  +//        buf.append("----------------------------------------------------");
  +//        buf.append(EOL);
  +//        buf.append(PerfMain.getConcurrentThreads() + " concurrent threads, handle " + PerfMain.getIterationsPerThread() + " articles per thread");
  +//        buf.append(EOL);
  +//        buf.append("- " + (result.isStressMode()==false ? "performance mode" : "stress mode -"));
  +//        buf.append(EOL);
  +//        buf.append("Test period: " + (double) (((double) result.getTestPeriod()) / 1000) + " [sec]");
  +//        buf.append(EOL);
  +//        buf.append("Inserting period: " + result.getInsertPeriod() + " [msec]");
  +//        buf.append(EOL);
  +//        buf.append("Fetching period: " + result.getFetchPeriod() + " [msec]");
  +//        buf.append(EOL);
  +//        buf.append("Deleting period: " + result.getDeletePeriod() + " [msec]");
  +//        buf.append(EOL);
  +//
  +//        if (result.isValid())
  +//        {
  +//            buf.append(EOL + "Test was successful" + EOL);
  +//        }
  +//        else
  +//        {
  +//            buf.append(EOL + buildObjectBeforeAfterList(result.consistentList) + EOL);
  +//        }
  +//
  +//        buf.append("----------------------------------------------------");
  +//
  +//        return buf.toString();
  +//    }
  +
       private String buildObjectBeforeAfterList(List consistentList)
       {
           StringBuffer buf = new StringBuffer();
  @@ -277,6 +350,7 @@
           {
               result = new PerfResult();
               result.setTestName(testName);
  +            result.setStressMode(isUseStressMode());
               result.setIterationsPerThread(getIterationsPerThread());
               result.setNumberOfThreads(getConcurrentThreads());
               result.setTestLoops(getTestLoops());
  @@ -338,6 +412,7 @@
       {
           private String testName;
           private long testPeriod;
  +        private boolean stressMode;
   
           private int testLoops;
           private int numberOfThreads;
  @@ -359,19 +434,18 @@
   
           public String toString()
           {
  -            String eol = System.getProperty("line.separator");
               StringBuffer buf = new StringBuffer();
  -            buf.append(eol + "[" + this.getClass().getName());
  -            buf.append(eol + "testName=" + testName);
  -            buf.append(eol + "testPeriod=" + testPeriod);
  -            buf.append(eol + "testLoops=" + testLoops);
  -            buf.append(eol + "numberOfThreads=" + numberOfThreads);
  -            buf.append(eol + "iterationsPerThread=" + iterationsPerThread);
  -            buf.append(eol + "isValid=" + isValid());
  -            buf.append(eol + "insertPeriod=" + getInsertPeriod());
  -            buf.append(eol + "fetchPeriod=" + getFetchPeriod());
  -            buf.append(eol + "deletePeriod=" + getDeletePeriod());
  -            buf.append(eol + "consistentList: " + consistentList);
  +            buf.append(EOL + "[" + this.getClass().getName());
  +            buf.append(EOL + "testName=" + testName);
  +            buf.append(EOL + "testPeriod=" + testPeriod);
  +            buf.append(EOL + "testLoops=" + testLoops);
  +            buf.append(EOL + "numberOfThreads=" + numberOfThreads);
  +            buf.append(EOL + "iterationsPerThread=" + iterationsPerThread);
  +            buf.append(EOL + "isValid=" + isValid());
  +            buf.append(EOL + "insertPeriod=" + getInsertPeriod());
  +            buf.append(EOL + "fetchPeriod=" + getFetchPeriod());
  +            buf.append(EOL + "deletePeriod=" + getDeletePeriod());
  +            buf.append(EOL + "consistentList: " + consistentList);
               buf.append("]");
               return buf.toString();
           }
  @@ -380,6 +454,16 @@
           {
               this.consistentList.add(entry);
               valid = valid && entry.isPassed();
  +        }
  +
  +        public boolean isStressMode()
  +        {
  +            return stressMode;
  +        }
  +
  +        public void setStressMode(boolean stressMode)
  +        {
  +            this.stressMode = stressMode;
           }
   
           public boolean isValid()
  
  
  
  1.2       +41 -9     db-ojb/src/test/org/apache/ojb/performance/PerfHandle.java
  
  Index: PerfHandle.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/performance/PerfHandle.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PerfHandle.java	6 Feb 2003 01:20:54 -0000	1.1
  +++ PerfHandle.java	7 Feb 2003 10:58:40 -0000	1.2
  @@ -2,6 +2,7 @@
   
   import java.util.Collection;
   import java.util.Iterator;
  +import java.math.BigDecimal;
   
   /**
    * Derivate this class to implement a test client for the performance test.
  @@ -28,6 +29,11 @@
       public abstract void init() throws Exception;
   
       /**
  +     * Do clean up.
  +     */
  +    public abstract void tearDown() throws Exception;
  +
  +    /**
        * Store the given articles to database. Do optimize
        * performance.
        */
  @@ -61,6 +67,20 @@
       public abstract void deleteArticlesStress(PerfArticle[] arr) throws Exception;
   
       /**
  +     * Called to get a new instance class of the {@link org.apache.ojb.performance.PerfArticle}
  +     * interface, override this method if you need your own implementation
  +     * (with default constructor) of the PerfArticle-Interface.
  +     * <br/>
  +     * By default this method returns a new instance of the
  +     * {@link org.apache.ojb.performance.PerfArticleImpl} class.
  +     *
  +     */
  +    public PerfArticle newPerfArticle()
  +    {
  +        return new PerfArticleImpl();
  +    }
  +
  +    /**
        * The returned name was used as 'articleName' for all
        * created <code>PerfArticles</code> for this thread.
        * This allows an easy build of the query statement
  @@ -76,14 +96,26 @@
       }
   
       /**
  -     * Return a new instance of a {@link PerfArticle} implementation.
  -     */
  -    public abstract PerfArticle newPerfArticle(String articleName);
  -
  -    /**
  -     * Do clean up.
  +     * Factory method that creates an {@link org.apache.ojb.performance.PerfArticle}
  +     * using the {@link org.apache.ojb.performance.PerfArticleImpl} class,
  +     * override this method if you need your own implementation
  +     * of the PerfArticle-Interface.
  +     *
  +     * @param articleName set the 'articleName'
  +     * @return the created PerfArticle object
        */
  -    public abstract void tearDown() throws Exception;
  +    protected PerfArticle getPreparedPerfArticle(String articleName)
  +    {
  +        PerfArticle a = newPerfArticle();
  +        a.setArticleName(articleName);
  +        a.setMinimumStock(100);
  +        a.setPrice(new BigDecimal(0.45));
  +        a.setProductGroupId(1);
  +        a.setStock(234);
  +        a.setSupplierId(4);
  +        a.setUnit("bottle");
  +        return a;
  +    }
   
       /**
        * Runnable implementation method.
  @@ -93,7 +125,7 @@
           arr = new PerfArticle[PerfMain.getIterationsPerThread()];
           for (int i = 0; i < PerfMain.getIterationsPerThread(); i++)
           {
  -            PerfArticle a = newPerfArticle(getTestObjectName());
  +            PerfArticle a = getPreparedPerfArticle(getTestObjectName());
               arr[i] = a;
           }
   
  
  
  
  1.15      +300 -438  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.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- PerformanceTest2.java	31 Jan 2003 17:50:04 -0000	1.14
  +++ PerformanceTest2.java	7 Feb 2003 10:58:40 -0000	1.15
  @@ -8,89 +8,42 @@
   import org.apache.ojb.broker.query.Query;
   import org.apache.ojb.broker.query.QueryByCriteria;
   import org.apache.ojb.broker.util.ObjectModificationDefaultImpl;
  +import org.apache.ojb.broker.util.logging.Logger;
  +import org.apache.ojb.broker.util.logging.LoggerFactory;
   import org.apache.ojb.odmg.OJB;
  +import org.odmg.DList;
   import org.odmg.Database;
   import org.odmg.Implementation;
  -import org.odmg.ODMGException;
   import org.odmg.OQLQuery;
   import org.odmg.Transaction;
   
   import java.util.Iterator;
  -import java.util.List;
   
   /**
  - * A stress/performance test for the PB- and ODMG-api
  - * in multi-threaded environments.
  - * <p>
  - * <b>You have two possibilities to run this test:</b>
  - * <p>
  - * - use the build script and call
  - * <br/>
  - * <code>bin/build.sh performance2</code>
  - * or
  - * <br/>
  - * <code>bin\build.bat performance2</code>
  - * </p>
  - * <p>
  - * - or perform the test class by yourself
  - * <br/>
  - * <code>
  - * java -classpath .... PerformanceTest2 10 2000 false 3 2 true
  - * </code>
  - * <br/>
  - * The programm parameter are in order of use:
  - * <ul>
  - * <li>number of concurrent threads</li>
  - * <li>number of handled objects per thread</li>
  - * <li><code>true</code> client side id generation </li>
  - * <li>chose the api: <i>1</i> PB-api test, <i>2</i> ODMG-api test, <i>3</i> both api tests</li>
  - * <li>number of test loops</li>
  - * <li><code>true</code> use a special stress mode (useful for development)</li>
  - * </ul>
  - * </p>
  - * </p>
  - *
  + * stress test against one database using several threads
    *
    * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>.
    * @version $Id$
    */
   public class PerformanceTest2 //extends TestCase
   {
  -    private static final String PREFIX_LOG = "[" + PerformanceTest2.class.getName() + "] ";
  -    /**
  -     * iterations per thread
  -     */
       private static int iterationsPerThread = 1000;
  -    /**
  -     * number of concurrent threads
  -     */
       private static int concurrentThreads = 10;
  -    /**
  -     * used for client generated ids
  -     */
  +    // used for client generated ids
       private static int id = 10001;
  -    /**
  -     * if set false, we use autoincrement key gerneration
  -     */
  +    // if set false, we use autoincrement key gerneration
       private static boolean clientKeyGeneration = false;
  -    /**
  -     * 1 PB-api test, 2 ODMG-api test, 3 both api tests
  -     */
       private static int whichTest = 3;
  -    /**
  -     * if false we use performance optimized delete/insert method
  -     */
  -    private static boolean useStressMode = false;
   
       /**
  -     * testTimes[0] startTime/test length
  -     * testTimes[1] inserting times
  -     * testTimes[2] fetching times
  -     * testTimes[3] deleting times
  +     * times[0] startTime/test length
  +     * times[1] inserting times
  +     * times[2] fetching times
  +     * times[3] deleting times
        */
  -    private long[] testTimes;
  +    private long[] times;
       private int threadCount;
  -    // private Logger log = LoggerFactory.getLogger(PerformanceTest2.class);
  +    private Logger log = LoggerFactory.getLogger(PerformanceTest2.class);
       public ThreadGroup threadGroup = new ThreadGroup("PerfTest");
       private String databaseName = TestHelper.DEF_DATABASE_NAME;
   
  @@ -99,6 +52,126 @@
           this.threadCount = concurrentThreads;
       }
   
  +    /**
  +     * generate client made ids
  +     */
  +    public synchronized static int getId()
  +    {
  +        return ++id;
  +    }
  +
  +    public int getArticleCount()
  +    {
  +        Criteria c = new Criteria();
  +        Query q = new QueryByCriteria(PerformanceArticle.class, c);
  +        int count = 0;
  +        try
  +        {
  +            PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  +            count = broker.getCount(q);
  +            broker.close();
  +        }
  +        catch (Exception e)
  +        {
  +            e.printStackTrace();
  +        }
  +        return count;
  +    }
  +
  +    public ThreadGroup getThreadGroup()
  +    {
  +        return threadGroup;
  +    }
  +
  +    public synchronized void checkOut()
  +    {
  +        --threadCount;
  +    }
  +
  +    public synchronized void addTime(int position, long time)
  +    {
  +        times[position] = times[position] + time;
  +    }
  +
  +    public synchronized int activeThreads(boolean notify)
  +    {
  +        try
  +        {
  +            //freeze main thread, we only want to trace client threads
  +            if (!notify)
  +                wait();
  +            else
  +                notifyAll();
  +        }
  +        catch (InterruptedException e)
  +        {
  +        }
  +        return this.threadCount;
  +    }
  +
  +    /**
  +     * Setting up the test fixture.
  +     */
  +    public void init() throws Exception
  +    {
  +//        log.info("Start init performance test");
  +        times = new long[4];
  +        threadCount = concurrentThreads;
  +
  +        if (whichTest == 1 || whichTest == 3)
  +        {
  +//        log.info("Init PB-API");
  +            PerformanceArticle art = createArticle(1000);
  +            PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  +            broker.beginTransaction();
  +            broker.store(art);
  +            broker.commitTransaction();
  +
  +            broker.beginTransaction();
  +            broker.delete(art);
  +            broker.commitTransaction();
  +            broker.close();
  +        }
  +
  +        if (whichTest == 2 || whichTest == 3)
  +        {
  +//        log.info("Init ODMG-API");
  +            PerformanceArticle art2 = createArticle(1001);
  +            Implementation ojb = OJB.getInstance();
  +            Database db = ojb.newDatabase();
  +            db.open(databaseName, Database.OPEN_READ_WRITE);
  +            Transaction tx = ojb.newTransaction();
  +            tx.begin();
  +            tx.lock(art2, Transaction.WRITE);
  +            tx.commit();
  +
  +            tx.begin();
  +            db.deletePersistent(art2);
  +            tx.commit();
  +            db.close();
  +//        log.info("End init performance test");
  +        }
  +    }
  +
  +    /**
  +     * factory method that createa an PerformanceArticle
  +     * @return the created PerformanceArticle object
  +     */
  +    private PerformanceArticle createArticle(int id)
  +    {
  +        PerformanceArticle a = new PerformanceArticle();
  +        if (clientKeyGeneration) a.setArticleId(getId());
  +        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;
  +    }
  +
       public static void main(String[] args)
       {
           int loops = args.length > 4 ? Integer.parseInt(args[4]) : 1;
  @@ -115,31 +188,22 @@
   
       private static void performTest(String[] args)
       {
  -        // number of threads
           if (args.length > 0)
           {
               concurrentThreads = Integer.parseInt(args[0]);
           }
  -        // number of loops per thread
           if (args.length > 1)
           {
               iterationsPerThread = Integer.parseInt(args[1]);
           }
  -        // client side key generation
           if (args.length > 2)
           {
               clientKeyGeneration = Boolean.valueOf(args[2]).booleanValue();
           }
  -        // select the api
           if (args.length > 3)
           {
               whichTest = Integer.parseInt(args[3]);
           }
  -        // run in stress mode
  -        if (args.length > 5)
  -        {
  -            useStressMode = Boolean.valueOf(args[5]).booleanValue();
  -        }
           try
           {
               PerformanceTest2 test = new PerformanceTest2();
  @@ -154,19 +218,20 @@
                   test.testMultithreaded_PB_api();
                   while (test.threadGroup.activeCount() > activeThreadsStart)
                   {
  -                    System.out.println("# active threads: " + test.threadGroup.activeCount());
  +                    System.err.println("# active threads: " + test.threadGroup.activeCount());
                       try
                       {
  -                        Thread.sleep(500);
  +                        Thread.sleep(1500);
                       }
                       catch (InterruptedException e)
                       {
                       }
                   }
  +
  +                System.err.println("Test-Info:   Objects in DB before PB test: " + objectCount);
                   objectCountAfter = test.getArticleCount();
  -                System.out.println("Test-Info:   Objects in DB before PB test: " + objectCount);
  -                System.out.println("Test-Info:   Objects in DB after PB test: " + objectCountAfter);
  -                System.out.println("Test-Info:   Stress test was successful? - " + (objectCount == objectCountAfter) + " -");
  +                System.err.println("Test-Info:   Objects in DB after PB test: " + objectCountAfter);
  +                System.err.println("Test-Info:   Stress test was successful? - " + (objectCount == objectCountAfter) + " -");
               }
   
   
  @@ -178,19 +243,20 @@
                   test.testMultithreaded_ODMG_api();
                   while (test.threadGroup.activeCount() > activeThreadsStart)
                   {
  -                    System.out.println("# active threads: " + test.threadGroup.activeCount());
  +                    System.err.println("# active threads: " + test.threadGroup.activeCount());
                       try
                       {
  -                        Thread.sleep(500);
  +                        Thread.sleep(1500);
                       }
                       catch (InterruptedException e)
                       {
                       }
                   }
  +
  +                System.err.println("Test-Info:   Objects in DB before ODMG test: " + objectCount);
                   objectCountAfter = test.getArticleCount();
  -                System.out.println("Test-Info:   Objects in DB before ODMG test: " + objectCount);
  -                System.out.println("Test-Info:   Objects in DB after ODMG test: " + objectCountAfter);
  -                System.out.println("Test-Info:   Stress test was successful? - " + (objectCount == objectCountAfter) + " -");
  +                System.err.println("Test-Info:   Objects in DB after ODMG test: " + objectCountAfter);
  +                System.err.println("Test-Info:   Stress test was successful? - " + (objectCount == objectCountAfter) + " -");
               }
           }
           catch (Exception e)
  @@ -199,55 +265,12 @@
           }
       }
   
  -
  -    public ThreadGroup getThreadGroup()
  -    {
  -        return threadGroup;
  -    }
  -
  -    public synchronized void checkOut()
  -    {
  -        --threadCount;
  -    }
  -
  -    public synchronized void addTime(int position, long time)
  -    {
  -        testTimes[position] = testTimes[position] + time;
  -    }
  -
  -    public synchronized int activeThreads(boolean notify)
  -    {
  -        try
  -        {
  -            //freeze main thread, we only want to trace client threads
  -            if (!notify)
  -                wait();
  -            else
  -                notifyAll();
  -        }
  -        catch (InterruptedException e)
  -        {
  -        }
  -        return this.threadCount;
  -    }
  -
  -    /**
  -     * Setting up the test fixture.
  -     */
  -    public void init() throws Exception
  -    {
  -        System.out.println(PREFIX_LOG + "init test");
  -        testTimes = new long[4];
  -        threadCount = concurrentThreads;
  -    }
  -
  -
       public void testMultithreaded_PB_api()
       {
           String sep = System.getProperty("line.separator");
  -        testTimes[0] = System.currentTimeMillis();
  -        System.out.println(PREFIX_LOG + sep + sep + "++ Start thread generation for PB api test ++");
  -        System.out.println(PREFIX_LOG + "Begin with performance test, " + concurrentThreads +
  +        times[0] = System.currentTimeMillis();
  +        log.info(sep + sep + "++ Start thread generation for PB api test ++");
  +        log.info("Begin with performance test, " + concurrentThreads +
                   " concurrent threads, handle " + iterationsPerThread + " articles form each thread");
           for (int i = 0; i < concurrentThreads; i++)
           {
  @@ -262,17 +285,17 @@
               //this thread,
               //cause we do not want to trace this loop
           }
  -        testTimes[0] = (long) (System.currentTimeMillis() - testTimes[0]);
  -        System.out.println(PREFIX_LOG + buildTestSummary("PB API"));
  -        System.out.println(PREFIX_LOG + "++ End of performance test PB api ++" + sep + sep);
  +        times[0] = (long) (System.currentTimeMillis() - times[0]);
  +        log.info(buildTestSummary("PB API"));
  +        log.info("++ End of performance test PB api ++" + sep + sep);
       }
   
       public void testMultithreaded_ODMG_api()
       {
           String sep = System.getProperty("line.separator");
  -        testTimes[0] = System.currentTimeMillis();
  -        System.out.println(PREFIX_LOG + "++ Start thread generation for ODMG api test ++");
  -        System.out.println(PREFIX_LOG + "Begin with performance test, " + concurrentThreads +
  +        times[0] = System.currentTimeMillis();
  +        log.info("++ Start thread generation for ODMG api test ++");
  +        log.info("Begin with performance test, " + concurrentThreads +
                   " concurrent threads, handle " + iterationsPerThread + " articles form each thread");
           for (int i = 0; i < concurrentThreads; i++)
           {
  @@ -286,35 +309,9 @@
               //this thread,
               //cause we do not want to trace this loop
           }
  -        testTimes[0] = (long) (System.currentTimeMillis() - testTimes[0]);
  -        System.out.println(PREFIX_LOG + buildTestSummary("ODMG"));
  -        System.out.println(PREFIX_LOG + "++ End of performance test ODMG api ++" + sep);
  -    }
  -
  -    /**
  -     * generate client made ids
  -     */
  -    public synchronized static int getId()
  -    {
  -        return ++id;
  -    }
  -
  -    private int getArticleCount()
  -    {
  -        Criteria c = new Criteria();
  -        Query q = new QueryByCriteria(PerformanceArticle.class, c);
  -        int count = 0;
  -        try
  -        {
  -            PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  -            count = broker.getCount(q);
  -            broker.close();
  -        }
  -        catch (Exception e)
  -        {
  -            e.printStackTrace();
  -        }
  -        return count;
  +        times[0] = (long) (System.currentTimeMillis() - times[0]);
  +        log.info(buildTestSummary("ODMG"));
  +        log.info("++ End of performance test ODMG api ++" + sep);
       }
   
       private String buildTestSummary(String key)
  @@ -328,103 +325,87 @@
           buf.append(sep);
           buf.append(concurrentThreads + " concurrent threads, handle " + iterationsPerThread + " articles per thread");
           buf.append(sep);
  -        buf.append("Test period: " + (double) (((double) testTimes[0]) / 1000) + " [sec]");
  +        buf.append("Test period: " + (double) (((double) times[0]) / 1000) + " [sec]");
           buf.append(sep);
  -        buf.append("Inserting period: " + (testTimes[1] / (concurrentThreads)) + " [msec]");
  +        buf.append("Inserting period: " + (times[1] / (concurrentThreads)) + " [msec]");
           buf.append(sep);
  -        buf.append("Fetching period: " + (testTimes[2] / (concurrentThreads)) + " [msec]");
  +        buf.append("Fetching period: " + (times[2] / (concurrentThreads)) + " [msec]");
           buf.append(sep);
  -        buf.append("Deleting period: " + (testTimes[3] / (concurrentThreads)) + " [msec]");
  +        buf.append("Deleting period: " + (times[3] / (concurrentThreads)) + " [msec]");
           buf.append(sep);
           buf.append("----------------------------------------------------");
   
           return buf.toString();
       }
   
  -
  -
  -    // =====================================================================================
  -    // Inner class
  -    // =====================================================================================
  -
       /**
        * ODMG-api test class
        */
  -    class PerfomanceTestClientODMG extends PerfHandle
  +    class PerfomanceTestClientODMG implements Runnable
       {
  -        private String objectName;
  +        private static final String PRE_NAME = "A_";
  +        private PerformanceArticle[] arr;
           private Implementation odmg;
  +        private String threadName;
           private Database db;
  -        private boolean notInit = true;
   
           public PerfomanceTestClientODMG()
           {
           }
   
  -        void init()
  +        public void run()
           {
  +            odmg = OJB.getInstance();
  +            threadName = Thread.currentThread().toString();
  +            arr = new PerformanceArticle[iterationsPerThread];
  +            for (int i = 0; i < iterationsPerThread; i++)
  +            {
  +                PerformanceArticle a = createArticle(i, threadName);
  +                arr[i] = a;
  +            }
  +
  +            //log.info("Thread "+this+" run");
               try
               {
  -                odmg = OJB.getInstance();
  -                db = odmg.newDatabase();
  -                db.open(databaseName, Database.OPEN_READ_WRITE);
  +                insertNewArticles();
  +                readArticlesByCursor();
  +                deleteArticles();
               }
  -            catch (ODMGException e)
  +            catch (Throwable e)
               {
  -                e.printStackTrace();
  +                log.error("Error in client " + this, e);
               }
  -        }
  -
  -        void tearDown() throws Exception
  -        {
  -            db.close();
  -        }
  -
  -        String getTestObjectName()
  -        {
  -            if (objectName == null) objectName = "PB_" + Thread.currentThread().toString();
  -            return objectName;
  -        }
  -
  -        /**
  -         * A performance optimized insert-method implementation,
  -         * use this to test performance - set
  -         * {@link useStressMode} to <code>false</code>
  -         */
  -        protected void insertNewArticles() throws Exception
  -        {
  -            Transaction tx = odmg.newTransaction();
  -            tx.begin();
  -            for (int i = 0; i < arr.length; i++)
  +            finally
               {
  -                tx.lock(arr[i], Transaction.WRITE);
  +                checkOut();
  +                activeThreads(true);
               }
  -            tx.commit();
           }
   
           /**
  -         * A resource cumbering insert-method implementation,
  -         * use this to test implementation - set
  -         * {@link useStressMode} to <code>true</code>
  +         * factory method that createa an PerformanceArticle
  +         * @return the created PerformanceArticle object
            */
  -        protected void insertNewArticlesStress() throws Exception
  +        private PerformanceArticle createArticle(int id, String name)
           {
  -            for (int i = 0; i < arr.length; i++)
  -            {
  -                Transaction tx = odmg.newTransaction();
  -                tx.begin();
  -                tx.lock(arr[i], Transaction.WRITE);
  -                tx.commit();
  -            }
  +            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;
           }
   
  -        /**
  -         * A performance optimized delete-method implementation,
  -         * use this to test performance - set
  -         * {@link useStressMode} to <code>false</code>
  -         */
           protected void deleteArticles() throws Exception
           {
  +            long start = System.currentTimeMillis();
  +            Database db = odmg.newDatabase();
  +            db.open(databaseName, Database.OPEN_READ_WRITE);
               Transaction tx = odmg.newTransaction();
               tx.begin();
               for (int i = 0; i < arr.length; i++)
  @@ -432,34 +413,44 @@
                   db.deletePersistent(arr[i]);
               }
               tx.commit();
  +            db.close();
  +            long stop = System.currentTimeMillis();
  +            times[3] = times[3] + (stop - start);
           }
   
  -        /**
  -         * A resource cumbering insert-method implementation,
  -         * use this to test implementation - set
  -         * {@link useStressMode} to <code>true</code>
  -         */
  -        protected void deleteArticlesStress() throws Exception
  +        protected void insertNewArticles() throws Exception
           {
  +            long start = System.currentTimeMillis();
  +            Database db = odmg.newDatabase();
  +            db.open(databaseName, Database.OPEN_READ_WRITE);
  +            Transaction tx = odmg.newTransaction();
  +            tx.begin();
               for (int i = 0; i < arr.length; i++)
               {
  -                Transaction tx = odmg.newTransaction();
  -                tx.begin();
  -                db.deletePersistent(arr[i]);
  -                tx.commit();
  +                tx.lock(arr[i], Transaction.WRITE);
               }
  +            tx.commit();
  +            db.close();
  +            long stop = System.currentTimeMillis();
  +            times[1] = times[1] + (stop - start);
           }
   
           protected void readArticlesByCursor() throws Exception
           {
  -            Transaction tx = odmg.newTransaction();
  -            tx.begin();
  +            long start = System.currentTimeMillis();
  +            int artId = arr[0].articleId;
  +
  +            Database db = odmg.newDatabase();
  +            db.open(databaseName, Database.OPEN_READ_WRITE);
  +// for better performance we could read without a tx
  +//            Transaction tx = ojb.newTransaction();
  +//            tx.begin();
               OQLQuery query = odmg.newOQLQuery();
               String sql = "select allArticles from " + PerformanceArticle.class.getName() +
  -                    " where articleName like \"" + objectName + "\"";
  +                    " where articleName = \"" + PRE_NAME + threadName + "\"";
               query.create(sql);
  -            List allProducts = (List) query.execute();
  -            tx.commit();
  +            DList allProducts = (DList) query.execute();
  +//            tx.commit();
               Iterator iter = allProducts.iterator();
               int fetchCount = 0;
               while (iter.hasNext())
  @@ -467,48 +458,74 @@
                   fetchCount++;
                   PerformanceArticle a = (PerformanceArticle) iter.next();
               }
  -            if (fetchCount != arr.length)
  -            {
  -                System.out.println("## Read objects: Could not found number of created objects, expected " +
  -                        (arr.length) + " found " + fetchCount + " ##");
  -            }
  +            db.close();
  +            long stop = System.currentTimeMillis();
  +            times[2] = times[2] + (stop - start);
           }
       }
   
   
  -
  -    // =====================================================================================
  -    // Inner class
  -    // =====================================================================================
  -
       /**
        * PB-api test class
        */
  -    class PerfomanceTestClientPB extends PerfHandle implements Runnable
  +    class PerfomanceTestClientPB implements Runnable
       {
  -        private String objectName;
  +        private PerformanceArticle[] arr;
   
           public PerfomanceTestClientPB()
           {
  +            arr = new PerformanceArticle[iterationsPerThread];
  +            for (int i = 0; i < iterationsPerThread; i++)
  +            {
  +                PerformanceArticle a = createArticle(i);
  +                arr[i] = a;
  +            }
  +            //log.info("Articles created");
           }
   
  -        String getTestObjectName()
  +        public void run()
           {
  -            if (objectName == null) objectName = "PB_" + Thread.currentThread().toString();
  -            return objectName;
  +            //log.info("Thread "+this+" run");
  +            try
  +            {
  +                insertNewArticles();
  +                readArticlesByCursor();
  +                deleteArticles();
  +            }
  +            catch (Throwable e)
  +            {
  +                log.error("Error in client " + this, e);
  +            }
  +            finally
  +            {
  +                checkOut();
  +                activeThreads(true);
  +            }
           }
   
  -        void init() throws Exception
  +        /**
  +         * factory method that createa an PerformanceArticle
  +         * @return the created PerformanceArticle object
  +         */
  +        private PerformanceArticle createArticle(int id)
           {
  +            PerformanceArticle a = new PerformanceArticle();
  +            if (clientKeyGeneration) a.setArticleId(getId());
  +            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;
           }
   
  -        /**
  -         * A resource cumbering insert-method implementation,
  -         * use this to test implementation - set
  -         * {@link useStressMode} to <code>true</code>
  -         */
  -        protected void insertNewArticlesStress() throws Exception
  +        protected void deleteArticles() throws Exception
           {
  +            long start = System.currentTimeMillis();
  +
               for (int i = 0; i < arr.length; i++)
               {
                   PersistenceBroker broker = null;
  @@ -516,80 +533,27 @@
                   {
                       broker = PersistenceBrokerFactory.defaultPersistenceBroker();
                       broker.beginTransaction();
  -                    broker.store(arr[i]);
  +                    broker.delete(arr[i]);
                       broker.commitTransaction();
                   }
                   finally
                   {
                       if (broker != null) broker.close();
                   }
  -
               }
  +
  +            long stop = System.currentTimeMillis();
  +            times[3] = times[3] + (stop - start);
           }
   
  -        /**
  -         * A performance optimized insert-method implementation,
  -         * use this to test performance - set
  -         * {@link useStressMode} to <code>false</code>
  -         */
           protected void insertNewArticles() throws Exception
           {
  +
               ObjectModificationDefaultImpl needsInsert = new ObjectModificationDefaultImpl();
               needsInsert.setNeedsInsert(true);
  -            PersistenceBroker broker = null;
  -            try
  -            {
  -                broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  -                broker.serviceConnectionManager().setBatchMode(true);
  -                broker.beginTransaction();
  -                for (int i = 0; i < arr.length; i++)
  -                {
  -                    broker.store(arr[i], needsInsert);
  -                }
  -                broker.commitTransaction();
  -            }
  -            finally
  -            {
  -                if (broker != null) broker.close();
  -            }
  -        }
  -
  -        protected void readArticlesByCursor() throws Exception
  -        {
  -            Criteria c = new Criteria();
  -            c.addLike("articleName", objectName);
  -            Query q = new QueryByCriteria(PerformanceArticle.class, c);
   
  -            PersistenceBroker broker = null;
  -            try
  -            {
  -                broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  -                Iterator iter = broker.getIteratorByQuery(q);
  -                int fetchCount = 0;
  -                while (iter.hasNext())
  -                {
  -                    fetchCount++;
  -                    PerformanceArticle a = (PerformanceArticle) iter.next();
  -                }
  -                if (fetchCount != arr.length)
  -                {
  -                    System.out.println("## Read objects: Could not found number of created objects, expected " +
  -                            (arr.length) + " found " + fetchCount + " ##");
  -                }
  -            }
  -            finally
  -            {
  -                if (broker != null) broker.close();
  -            }
  -        }
  +            long start = System.currentTimeMillis();
   
  -        /**
  -         * A resource cumbering delete-method implementation,
  -         * use this to test implementation - set
  -         * {@link useStressMode} to <code>true</code>
  -         */
  -        protected void deleteArticlesStress() throws Exception
  -        {
               for (int i = 0; i < arr.length; i++)
               {
                   PersistenceBroker broker = null;
  @@ -597,151 +561,49 @@
                   {
                       broker = PersistenceBrokerFactory.defaultPersistenceBroker();
                       broker.beginTransaction();
  -                    broker.delete(arr[i]);
  +                    broker.store(arr[i], needsInsert);
                       broker.commitTransaction();
                   }
                   finally
                   {
                       if (broker != null) broker.close();
                   }
  -            }
  -        }
   
  -        /**
  -         * A performance optimized delete-method implementation,
  -         * use this to test performance - set
  -         * {@link useStressMode} to <code>false</code>
  -         */
  -        protected void deleteArticles() throws Exception
  -        {
  -            PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  -            try
  -            {
  -                broker.serviceConnectionManager().setBatchMode(true);
  -                broker.beginTransaction();
  -                for (int i = 0; i < arr.length; i++)
  -                {
  -                    broker.delete(arr[i]);
  -                }
  -                broker.commitTransaction();
               }
  -            finally
  -            {
  -                if (broker != null) broker.close();
  -            }
  -        }
   
  -        void tearDown() throws Exception
  -        {
  +            long stop = System.currentTimeMillis();
  +            times[1] = times[1] + (stop - start);
           }
  -    }
  -
  -
  -
  -    // =====================================================================================
  -    // Inner class
  -    // =====================================================================================
  -
  -    abstract class PerfHandle implements Runnable
  -    {
  -        PerformanceArticle[] arr;
  -        String threadName;
  -
  -        abstract void init() throws Exception;
  -
  -        abstract void insertNewArticles() throws Exception;
  -
  -        abstract void insertNewArticlesStress() throws Exception;
  -
  -        abstract void readArticlesByCursor() throws Exception;
  -
  -        abstract void deleteArticles() throws Exception;
  -
  -        abstract void deleteArticlesStress() throws Exception;
  -
  -        abstract String getTestObjectName();
  -
  -        abstract void tearDown() throws Exception;
   
  -        public void run()
  +        protected void readArticlesByCursor() throws Exception
           {
  -            arr = new PerformanceArticle[iterationsPerThread];
  -            for (int i = 0; i < iterationsPerThread; i++)
  -            {
  -                PerformanceArticle a = createArticle(getTestObjectName());
  -                arr[i] = a;
  -            }
  +            long start = System.currentTimeMillis();
  +            int artId = arr[0].articleId;
   
  +            Criteria c = new Criteria();
  +            c.addBetween("articleId", new Integer(artId), new Integer(artId + iterationsPerThread));
  +            Query q = new QueryByCriteria(PerformanceArticle.class, c);
  +
  +            PersistenceBroker broker = null;
               try
               {
  -                long period = 0;
  -                init();
  -                if (!useStressMode)
  -                {
  -                    period = System.currentTimeMillis();
  -                    insertNewArticles();
  -                    period = System.currentTimeMillis() - period;
  -                    addTime(1, period);
  -                }
  -                else
  -                {
  -                    period = System.currentTimeMillis();
  -                    insertNewArticlesStress();
  -                    period = System.currentTimeMillis() - period;
  -                    addTime(1, period);
  -                }
  -
  -                if (!useStressMode)
  -                {
  -                    period = System.currentTimeMillis();
  -                    readArticlesByCursor();
  -                    period = System.currentTimeMillis() - period;
  -                    addTime(2, period);
  -                }
  -                else
  +                broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  +                Iterator iter = broker.getIteratorByQuery(q);
  +                int fetchCount = 0;
  +                while (iter.hasNext())
                   {
  -                    period = System.currentTimeMillis();
  -                    readArticlesByCursor();
  -                    period = System.currentTimeMillis() - period;
  -                    addTime(2, period);
  +                    fetchCount++;
  +                    PerformanceArticle a = (PerformanceArticle) iter.next();
                   }
  -
  -                period = System.currentTimeMillis();
  -                deleteArticles();
  -                period = System.currentTimeMillis() - period;
  -                addTime(3, period);
  -
  -                tearDown();
  -            }
  -            catch (Exception e)
  -            {
  -                System.out.println(PREFIX_LOG + "## Error in client ##");
  -                e.printStackTrace();
               }
               finally
               {
  -                checkOut();
  -                activeThreads(true);
  +                if (broker != null) broker.close();
               }
  -        }
   
  -        /**
  -         * factory method that createa an PerformanceArticle
  -         * @return the created PerformanceArticle object
  -         */
  -        private PerformanceArticle createArticle(String name)
  -        {
  -            PerformanceArticle a = new PerformanceArticle();
  -            if (clientKeyGeneration) a.setArticleId(getId());
  -            a.setArticleName(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;
  +
  +            long stop = System.currentTimeMillis();
  +            times[2] = times[2] + (stop - start);
           }
       }
   }
  
  
  
  1.2       +12 -55    db-ojb/src/test/org/apache/ojb/broker/OJBPerfTest.java
  
  Index: OJBPerfTest.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/broker/OJBPerfTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- OJBPerfTest.java	6 Feb 2003 01:32:15 -0000	1.1
  +++ OJBPerfTest.java	7 Feb 2003 10:58:40 -0000	1.2
  @@ -20,8 +20,9 @@
   import java.util.List;
   
   /**
  - * The performance test implementation classes for testing
  - * the PB-api and ODMG-api of OJB.
  + * Performance test implementation classes for testing
  + * the PB-api and ODMG-api of OJB using the performance-package
  + * test classes.
    *
    * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>
    * @version $Id$
  @@ -82,27 +83,8 @@
           }
   
           /**
  -         * factory method that creates an {@link org.apache.ojb.performance.PerfArticle}
  -         * @param articleName set the 'articleName'
  -         * @return the created PerfArticle object
  -         */
  -        public PerfArticle newPerfArticle(String articleName)
  -        {
  -            PerfArticle a = new PerfArticleImpl();
  -            a.setArticleName(articleName);
  -            a.setMinimumStock(100);
  -            a.setPrice(new BigDecimal(0.45));
  -            a.setProductGroupId(1);
  -            a.setStock(234);
  -            a.setSupplierId(4);
  -            a.setUnit("bottle");
  -            return a;
  -        }
  -
  -        /**
            * A resource cumbering insert-method implementation,
  -         * use this to test implementation - set
  -         * {@link useStressMode} to <code>true</code>
  +         * this was used to test implementation.
            */
           public void insertNewArticlesStress(PerfArticle[] arr) throws Exception
           {
  @@ -126,8 +108,7 @@
   
           /**
            * A performance optimized insert-method implementation,
  -         * use this to test performance - set
  -         * {@link useStressMode} to <code>false</code>
  +         * used to test performance.
            */
           public void insertNewArticles(PerfArticle[] arr) throws Exception
           {
  @@ -173,8 +154,7 @@
   
           /**
            * A resource cumbering delete-method implementation,
  -         * use this to test implementation - set
  -         * {@link useStressMode} to <code>true</code>
  +         * used to test implementation
            */
           public void deleteArticlesStress(PerfArticle[] arr) throws Exception
           {
  @@ -197,8 +177,7 @@
   
           /**
            * A performance optimized delete-method implementation,
  -         * use this to test performance - set
  -         * {@link useStressMode} to <code>false</code>
  +         * used to test performance
            */
           public void deleteArticles(PerfArticle[] arr) throws Exception
           {
  @@ -299,8 +278,7 @@
   
           /**
            * A performance optimized insert-method implementation,
  -         * use this to test performance - set
  -         * {@link useStressMode} to <code>false</code>
  +         * used to test performance
            */
           public void insertNewArticles(PerfArticle[] arr) throws Exception
           {
  @@ -314,8 +292,7 @@
   
           /**
            * A resource cumbering insert-method implementation,
  -         * use this to test implementation - set
  -         * {@link useStressMode} to <code>true</code>
  +         * used to test implementation
            */
           public void insertNewArticlesStress(PerfArticle[] arr) throws Exception
           {
  @@ -342,8 +319,7 @@
   
           /**
            * A performance optimized delete-method implementation,
  -         * use this to test performance - set
  -         * {@link useStressMode} to <code>false</code>
  +         * use to test performance
            */
           public void deleteArticles(PerfArticle[] arr) throws Exception
           {
  @@ -357,8 +333,7 @@
   
           /**
            * A resource cumbering insert-method implementation,
  -         * use this to test implementation - set
  -         * {@link useStressMode} to <code>true</code>
  +         * use to test implementation
            */
           public void deleteArticlesStress(PerfArticle[] arr) throws Exception
           {
  @@ -369,24 +344,6 @@
                   db.deletePersistent(arr[i]);
                   tx.commit();
               }
  -        }
  -
  -        /**
  -         * factory method that creates an PerfArticle
  -         * @param articleName set the 'articleName'
  -         * @return the created PerfArticle object
  -         */
  -        public PerfArticle newPerfArticle(String articleName)
  -        {
  -            PerfArticle a = new PerfArticleImpl();
  -            a.setArticleName(articleName);
  -            a.setMinimumStock(100);
  -            a.setPrice(new BigDecimal(0.45));
  -            a.setProductGroupId(1);
  -            a.setStock(234);
  -            a.setSupplierId(4);
  -            a.setUnit("bottle");
  -            return a;
           }
       }
   }