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