OpenJPA Logo   ASF Logo

OpenJPA Beginners Performance Guide

This guide is targeted at new users of OpenJPA that would like to know some of the important performance tuning properties. Please do not mistake this for an exhaustive tuning guide. This is just enough information to make a developer dangerous, not lethal.

Enhancement

OpenJPA uses byte-code weaving technologies to enhance user created Entity class objects at build time or dynamically at run time. This allows us to efficiently handle these objects.

Follow the Entity Enhancement instructions on how to properly enhance your Entities.

OpenJPA also has a feature that will auto-generate new subclasses or proxy objects that front the user's Entity objects at run time, but this feature is not recommended for use. There are numerous functional issues reported and it doesn't perform nearly as well. If you ever see the following message you are using the non-recommended subclassing approach to enhancement.

3328 pu_name INFO [main] openjpa.Enhance - Creating subclass for "[ class org.apache.openjpa.entity.E1 , class org.apache.openjpa.entity.E2 ]". This means that your application will be less efficient and will consume more memory than it would if you ran the OpenJPA enhancer. Additionally, lazy loading will not be available for one-to-one and many-to-one persistent attributes in types using field access; they will be loaded eagerly instead.

It is recommended to set the following property to ensure that you don't use this enhancement approach.

<properties> 
    <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/>
<properties>

Connection Pooling

As of the 2.1.0 release OpenJPA bundles Apache Commons DBCP as part of the binary download. When running in JSE environments a default connection pool will be plugged in with the provided database configuration properties (Once OPENJPA-1764 is completed) . Most JEE container environments should provide some level of connection pooling.

In releases prior to 2.1.0 add DBCP to your classpath and use the following example to figure out how to configure pooling.

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
    <persistence-unit name="example-derby" transaction-type="RESOURCE_LOCAL">
	<properties>
	    <property name="openjpa.ConnectionProperties" 
		value="DriverClassName=org.apache.derby.jdbc.ClientDriver,
		  Url=jdbc:derby://localhost:1527/database, 
		  MaxActive=100, 
		  MaxWait=10000, 
		  TestOnBorrow=true, 
		  Username=user, 
		  Password=secret"/>
	    <property name="openjpa.ConnectionDriverName" 
		value="org.apache.commons.dbcp.BasicDataSource"/>
	</properties>
    </persistence-unit>
</persistence>

Caching

<properties> 
    <property name="openjpa.DataCache" value="true"/>
    <property name="openjpa.QueryCache" value="true"/>
<properties>

Insert details about what those two properties give me.

Copyright © 2006,2021 The Apache Software Foundation. Licensed under Apache License 2.0.
Apache, the Apache feather logo and OpenJPA are trademarks of The Apache Software Foundation.
Other names may be trademarks of their respective owners.