Choose benchmark test, operation and batch mode:

When one or more of the All filters is selected - only average normalized results are displayed. Please read Running and Results for more details.

Speed comparison of JPA database retrieval operations per second (higher is better)

 Derby
embedded
H2
embedded
HSQLDB
embedded
SQLite
embedded
DB4O
embedded
ObjectDB
embedded
Derby
server
H2
server
MySQL
server
PostgreSQL
server
ObjectDB
server
DataNucleus46,68752,01531,498 failed 4,7878,9451,07313,271 
EclipseLink109,626131,94694,537failed  33,19147,57273352,658 
Hibernate75,32963,25177,362failed  30,38625,57188344,334 
OpenJPA98,38573,00181,792   6,10423,19655446,405 
ObjectDB     391,006    77,097

Performance comparison chart - The Y-Axis represents normalized score in logarithmic scale - higher is better:
JPA performance benchmark comparision Hibernate, EclipseLink, OpenJPA, DataNucleus, ObjectDB

Performance comparison chart - The Y-Axis represents normalized score in linear scale - higher is better:
JPA performance benchmark comparision Hibernate, EclipseLink, OpenJPA, DataNucleus, ObjectDB

Best and Worst JPA/Database Performer in this comparison

The Most Efficient (the Fastest):

1. ObjectDB embedded100
2. EclipseLink with H2 embedded33.7
3. EclipseLink with Derby embedded28.0
4. OpenJPA with Derby embedded25.2
5. EclipseLink with HSQLDB embedded24.2
6. OpenJPA with HSQLDB embedded20.9
7. Hibernate with HSQLDB embedded19.8
8. ObjectDB server19.7
9. Hibernate with Derby embedded19.3
10. OpenJPA with H2 embedded18.7
11. Hibernate with H2 embedded16.2
12. EclipseLink with PostgreSQL server13.5
13. DataNucleus with H2 embedded13.3
14. EclipseLink with H2 server12.2
15. DataNucleus with Derby embedded11.9
16. OpenJPA with PostgreSQL server11.9
17. Hibernate with PostgreSQL server11.3

The Least Efficient (the Slowest):

18. EclipseLink with Derby server8.5
19. DataNucleus with HSQLDB embedded8.1
20. Hibernate with Derby server7.8
21. Hibernate with H2 server6.5
22. OpenJPA with H2 server5.9
23. DataNucleus with PostgreSQL server3.4
24. DataNucleus with H2 server2.3
25. OpenJPA with Derby server1.6
26. DataNucleus with Derby server1.2
27. DataNucleus with MySQL server0.27
28. Hibernate with MySQL server0.23
29. EclipseLink with MySQL server0.19
30. OpenJPA with MySQL server0.14
31. DataNucleus with DB4O embedded0.0000
32. EclipseLink with SQLite embedded0.0000
33. Hibernate with SQLite embedded0.0000

Problems (Exceptions) in these tests

  • EclipseLink with SQLite embedded
    Local Exception Stack: 
    Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.ConversionException
    Exception Description: The object [79,200,000], of class [class java.lang.Integer], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[lastLoginDate-->PERSON.LASTLOGINDATE]] with descriptor [RelationalDescriptor(org.jpab.basic.Person --> [DatabaseTable(PERSON)])], could not be converted to [class java.util.Date].
    	at org.eclipse.persistence.exceptions.ConversionException.couldNotBeConverted(ConversionException.java:71)
    	at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToUtilDate(ConversionManager.java:761)
    	at org.eclipse.persistence.internal.helper.ConversionManager.convertObject(ConversionManager.java:101)
    	at org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform.convertObject(DatasourcePlatform.java:157)
    	at org.eclipse.persistence.mappings.converters.TypeConversionConverter.convertDataValueToObjectValue(TypeConversionConverter.java:119)
    	at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.getAttributeValue(AbstractDirectMapping.java:675)
    	at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.valueFromRow(AbstractDirectMapping.java:1263)
    	at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.buildCloneFromRow(AbstractDirectMapping.java:1234)
    	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildAttributesIntoWorkingCopyClone(ObjectBuilder.java:1338)
    	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildWorkingCopyCloneFromRow(ObjectBuilder.java:1466)
    	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObjectInUnitOfWork(ObjectBuilder.java:558)
    	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:502)
    	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:454)
    	at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:721)
    	at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:723)
    	at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:420)
    	at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1074)
    	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:736)
    	at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1034)
    	at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:380)
    	at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1112)
    	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2909)
    	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1291)
    	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1273)
    	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1247)
    	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:479)
    	at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:714)
    	at org.jpab.Test.retireveEntities(Test.java:382)
    	at org.jpab.Test.doAction(Test.java:251)
    	at org.jpab.Runner$RetrieveAction.run0(Runner.java:550)
    	at org.jpab.Runner$TestAction.run(Runner.java:517)
    	at java.lang.Thread.run(Thread.java:662)
    
  • Hibernate with SQLite embedded
    javax.persistence.PersistenceException: org.hibernate.TransactionException: JDBC begin failed: 
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:1224)
    	at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:63)
    	at org.jpab.Test.persist(Test.java:210)
    	at org.jpab.Test.persist(Test.java:200)
    	at org.jpab.Runner$PersistAction.run0(Runner.java:538)
    	at org.jpab.Runner$TestAction.run(Runner.java:517)
    	at java.lang.Thread.run(Thread.java:662)
    Caused by: org.hibernate.TransactionException: JDBC begin failed: 
    	at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:92)
    	at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    	at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:60)
    	... 5 more
    Caused by: java.sql.SQLException: SQL logic error or missing database
    	at org.sqlite.DB.throwex(DB.java:288)
    	at org.sqlite.DB.exec(DB.java:68)
    	at org.sqlite.Conn.setAutoCommit(Conn.java:159)
    	at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881)
    	at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:87)
    	... 7 more
    
  • DataNucleus with DB4O embedded
    com.db4o.ext.DatabaseClosedException
    	at com.db4o.internal.ObjectContainerBase.checkClosed(ObjectContainerBase.java:310)
    	at com.db4o.internal.ObjectContainerBase.checkTransaction(ObjectContainerBase.java:338)
    	at com.db4o.internal.ObjectContainerBase.queryByExample(ObjectContainerBase.java:806)
    	at com.db4o.internal.ExternalObjectContainer.queryByExample(ExternalObjectContainer.java:68)
    	at org.datanucleus.store.db4o.valuegenerator.DB4OIncrementGenerator.reserveBlock(DB4OIncrementGenerator.java:142)
    	at org.datanucleus.store.valuegenerator.AbstractGenerator.reserveBlock(AbstractGenerator.java:305)
    	at org.datanucleus.store.db4o.valuegenerator.DB4OIncrementGenerator.obtainGenerationBlock(DB4OIncrementGenerator.java:97)
    	at org.datanucleus.store.valuegenerator.AbstractGenerator.obtainGenerationBlock(AbstractGenerator.java:197)
    	at org.datanucleus.store.valuegenerator.AbstractGenerator.next(AbstractGenerator.java:105)
    	at org.datanucleus.store.AbstractStoreManager.getStrategyValueForGenerator(AbstractStoreManager.java:1650)
    	at org.datanucleus.store.AbstractStoreManager.getStrategyValue(AbstractStoreManager.java:1550)
    	at org.datanucleus.state.JDOStateManager.populateStrategyFields(JDOStateManager.java:693)
    	at org.datanucleus.state.JDOStateManager.initialiseForPersistentNew(JDOStateManager.java:368)
    	at org.datanucleus.state.ObjectProviderFactory.newForPersistentNew(ObjectProviderFactory.java:163)
    	at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1797)
    	at org.datanucleus.ObjectManagerImpl.persistObjectWork(ObjectManagerImpl.java:1647)
    	at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1504)
    	at org.datanucleus.api.jpa.JPAEntityManager.persist(JPAEntityManager.java:535)
    	at org.jpab.Test.persist(Test.java:214)
    	at org.jpab.Test.persist(Test.java:200)
    	at org.jpab.Runner$PersistAction.run0(Runner.java:538)
    	at org.jpab.Runner$TestAction.run(Runner.java:517)
    	at java.lang.Thread.run(Thread.java:662)