Hello,
I work with web application that has Jackrabbit 2.10 embedded and we wanted
to try upgrading to Oak. Our current configuration that we use for
Jackrabbit 2.10 is the FileDataStore along with MySql for the Persistence
DataStore. We wrote some test cases to measure the performance of
JackRabbit 2.1.0 vs latest Oak 1.2. In the case of JackRabbit 2.10, we
used what our current application configuration – FileDataStore along with
MySql. In the case of Oak we tried many configurations but the one we
settled on was a DocumentNodeStore with a FileDataStore backend. We tried
all 3 RDB options (Mongo, PostGress, MySql). All Test cases used the same
code which standard JCR 2.0 code. The test cases did the following:
· create 1000 & 10,000 nodes
· move 1000 & 10,000 nodes
· copy 1000 & 10,000 nodes
· delete 1000 & 10,000 nodes
· upload 100 files
· read 1 property on 1000 & 10,000 nodes
· update 1 property on 1000 & 10,000 nodes
*The results were as follows (all results in milliseconds):*
Oak tests ran with the creation, move, copy, delete, update, and read of
1000 nodes:
Postgress seems to perform well overall.
In the case of Jackrabbit 2.10 (tests ran with the creation, move, copy,
delete, update, and read of 1000 nodes):
Jackrabbit 2.10 performs slightly better than Oak.
The next set of tests were ran with Oak with the creation, move, copy,
delete, update, and read of 10000 nodes:
Postgress once again performed ok. Mongo and MySql did not do well around
Moves, deletes, and updates. Querying did well also as indexes were created.
In the case of Jackrabbit 2.10 (tests ran with the creation, move, copy,
delete, update, and read of 10000 nodes):
Jackrabbit 2.10 performed much better than Oak in general.
*Based on the results I have a few questions/comments:*
· Are these fair comparisons between Jackrabbit and Oak? In our
application it is very possible to create 1-10,000 nodes in a user session.
· Should I have assumed Oak would outperform Jackrabbit 2.10?
· I understand MySql is experimental but Mongo is not – I would
assume Mongo would perform as well if not better than Postgress
· The performance bottlenecks seem to be at the JDBC level for
MySql. I made some configuration changes which helped performance but the
changes would make MySql fail any ACID tests.
*Just a few notes:*
The same JCR code was used for creating, moving, deleting etc any nodes.
The JCR code was used for all the tests. The tests were all run on the
same machine
Used DocumentMK Builder for all DataStores:
Mongo:
DocumentNodeStore storeD = new
DocumentMK.Builder().setPersistentCache("D:\\ekm-oak\\Mongo,size=1024,binary=0").setMongoDB(db).setBlobStore(new
DataStoreBlobStore(fds)).getNodeStore();
MySql:
RDBOptions options = new
RDBOptions().tablePrefix(prefix).dropTablesOnClose(false);
DocumentNodeStore storeD = new
DocumentMK.Builder().setBlobStore(new
DataStoreBlobStore(fds)).setClusterId(1).memoryCacheSize(64 * 1024 * 1024).
setPersistentCache("D:\\ekm-oak\\MySql,size=1024,binary=0").setRDBConnection(RDBDataSourceFactory.forJdbcUrl(url,
userName, password), options).getNodeStore();
PostGres:
RDBOptions options = new
RDBOptions().tablePrefix(prefix).dropTablesOnClose(false);
DocumentNodeStore storeD = new
DocumentMK.Builder().setAsyncDelay(0).setBlobStore(new
DataStoreBlobStore(fds)).setClusterId(1).memoryCacheSize(64 * 1024 * 1024).
setPersistentCache("D:\\ekm-oak\\postGress,size=1024,binary=0").setRDBConnection(RDBDataSourceFactory.forJdbcUrl(url,
userName, password), options).getNodeStore();
The repository was created the same for all three:
Repository repository = new Jcr(new Oak(storeD)).with(new
LuceneIndexEditorProvider()).with(configureSearch()).createRepository();
Any input is welcome….
Thanks,
Domenic