Hi list:

We ran a few tests on JR and Oracle and have posted our results here.
We welcome comments from the community.

JR and Database:
Single Workspace                                        
Single Repository (Oracle 10g)
225 Client Data                                 
DB Size 5330 MB                         
Index Size      947 MB                          

All times are in milliseconds

With Sequential Client Access                                   
100 Millisecond sleep between each thread creation                              
        
Clients Users   Min     Max     Total   Avg
5       1       313     703     2688    537
5       20      156     828     23793   237
10      5       156     938     14313   286
10      20      171     719     49475   247
20      5       187     812     27029   270
20      10      156     797     49588   247
50      5       156     844     59746   238
50      10      156     671     113150  226

With Random Client Access                                       
100 Millisecond sleep between each thread creation                              
        
Clients Users   Min     Max     Total   Avg
5       1       297     766     2548    509
5       20      171     781     25196   251
10      5       172     922     15418   308
10      20      156     813     46451   232
20      5       172     890     25684   256
20      10      141     813     45023   225
50      5       156     860     57672   230
50      10      156     812     130177  260


With Random Client Access                                       
100 Millisecond sleep between each thread creation                              
        
Read-Write-Read for one subset each in each user (thread)                       
                

Clients Users   Min     Max     Total   Avg
5       1       594     1016    3954    790
5       20      1172    3187    218414  2184
10      5       875     2219    77668   1553
10      20      1125    4485    587238  2936
20      5       1109    3391    216036  2160
20      20      938     7438    1732304 4330
50      10      578     8438    2461820 4923
100     8       1671    28593   9677890 12097

Hardware Configuration running JR:
- Intel Xeon 5130 (QuadCore) 2.0 GHz processor
- 3 GB RAM
- Windows XP Professional (32-Bit)
- Sun JDK 1.5.0_07
- JackRabbit 1.2.1
- Lucene 2.1.0
- JCR 1.0

Hardware Configuration running Oracle 10g
- Intel Xeon 5130 (QuadCore) 2.0 GHz processor
- 3 GB RAM
- Windows XP Professional (32-Bit)
- Sun JDK 1.5.0_07
- Oracle 10g as database for repository

Test Data:
Test data has 225 clients fullupgrade information in Oracle Database.
The Search Index for lucene is stored on the local machine.

A Customer has the following hierarchy:

/Product/Customer1/Configuration
/Product/Customer1/SalesData
/Product/Customer1/OtherData
/Product/Customer1/Configuration
/Product/Customer1/SalesData
/Product/Customer1/OtherData

Each of the above has some 30 to 50 nodes with properties.

Test Scenario:
Test is conducted for different clients (Customer1-Customer225) with
different combination of simultaneous users. Each user is a concurrent
thread. Each user is assumed to query 3 different subsets (nodes
within SalesData/Configuration/OtherData).
For example: In a setup when 10 customers are accessed by 5 concurrent
users each, 10x5x3 subset calls are made to JackRabbit.

Sequential / Random Customer Access:
In sequential Customer access, we request customers specific
information in order. If a test run needs to process 10 customers,
then it will query Customer1 through Customer225. In Random client
access from 225 clients, any 10 clients would be accessed.

Each sheet displays statistic for a single run.

Read/Write/Read test scenario tests concurrent Read/Write capabilities
of JackRabbit. Each user will have
3 queries. For the 1st and 3rd query, the program reads the data and
in the 2nd query it updates the node
with a test property..

The code:
final String ORDER_BY_JCR_SCORE_DESCENDING = " order by @jcr:score descending";


              String clientId = "Customer" + new Random().nextInt(225);

              String[] xpaths = new String[]{
                      "Product/" + clientId +
"/Configuration/*/[EMAIL PROTECTED]'primary'and @name='connectivity']",
                      "Reno/" + clientId +
"/Sales/*/[EMAIL PROTECTED]'local'and @name='Bill']",
                      "Reno/" + clientId +
"/OtherData/*/[EMAIL PROTECTED]'admin'and @name='Carl']"};

              long before = System.currentTimeMillis();
              String nodeName = null;
              for (int i = 0; i < xpaths.length; i++) {
                  String xpath = xpaths[i];

                  if (i != 1) {
                      // Write a node
                      Query query =
_session.getWorkspace().getQueryManager().createQuery(xpath +
ORDER_BY_JCR_SCORE_DESCENDING, Query.XPATH);
                      QueryResult queryResult = query.execute();
                      NodeIterator iterator = queryResult.getNodes();
                      queryResult = query.execute();
                      iterator = queryResult.getNodes();
                      while (iterator.hasNext()) {
                          Node node = iterator.nextNode();
                      }
                  } else {
                      Query query =
_session.getWorkspace().getQueryManager().createQuery(xpath +
ORDER_BY_JCR_SCORE_DESCENDING, Query.XPATH);
                      QueryResult queryResult = query.execute();
                      NodeIterator iterator = queryResult.getNodes();
                      int itCount = 0;
                      while (iterator.hasNext()) {
                          Node node = iterator.nextNode();
                          nodeName = node.getName();
  //                    System.out.println(nodeName);
                      }
                  }
              }
                                                                        

Notes:
1. The above code runs within a thread.
2. Between creating threads, we have introduced a 1000 ms delay, and
we get the above results.
3. If we do not introduce the thread sleep, then the java process
quickly runs out of heap space for new threads.
4. Each time a thread starts, we logon.
5. Each time work completes in a thread, we logout.

-- Sriram

Reply via email to