13 Understanding Performance Monitoring and Profiling

EclipseLink provides a diverse set of features to measure and optimize application performance. You can enable or disable most features in the descriptors or session, making any resulting performance gains global.

Performance considerations are present at every step of the development cycle. Although this implies an awareness of performance issues in your design and implementation, it does not mean that you should expect to achieve the best possible performance in your first pass.

For example, if optimization complicates the design, leave it until the final development phase. You should still plan for these optimizations from your first iteration, to make them easier to integrate later.

EclipseLink provides the following means to monitor and profile performance.

13.1 Performance Profiling

The EclipseLink performance profiler helps you identify performance problems by logging performance statistics for every executed query in a given session. The Profiler is described in "Monitoring and Optimizing TopLink-Enabled Applications" in Oracle Fusion Middleware Solutions Guide for Oracle TopLink.

13.2 Fetch Group Monitoring

Use the Fetch Group Monitor to measure fetch group field usage. This can be useful for performance analysis in a complex system.

Enable this monitor using the System property org.eclipse.persistence.fetchgroupmonitor=true.

The monitor dumps the attribute used for a class every time a new attribute is accessed.

For more information about fetch groups, see Section 6.2.1, "Fetch Groups".

13.3 Performance Monitoring

Use the Performance Monitor to provide detailed profiling and monitoring information in a multithreaded server environment.

Enable the monitor in persistence.xml as follows:

<property name="eclipselink.profiler" value="PerformanceMonitor"/>

The performance monitor can also be enabled through code using a SessionCustomizer.

The performance monitor will output a dump of cumulative statistics every minute to the EclipseLink log.

The statistics contains three sets of information:

  • Info; statistics that are constant informational data, such as the session name, or time of login.

  • Counter; statistics that are cumulative counters of total operations, such as cache hits, or query executions.

  • Timer; statistics that are cumulative measurements of total time (in nano seconds) for a specific type of operation, reading, writing, database operations.

Statistics are generally grouped in total and also by query type, query class, and query name. Counters and timers are generally recorded for the same operations, so the time per operation could also be calculated.

The time in between statistic dumps can be configured through the PerformanceMonitor API using the setDumpTime(long) API. If dumping the results is not desired, then the dumpTime attribute can be set to be very large such as Long.MAX_VALUE. The statistic can also be accessed in a Java program by using the getOperationTime(String) API.

The performance monitor can also be configured with a profile weight.

The profile weights are defined on SessionProfiler and include:

  • NONE; No statistics are recorded.

  • NORMAL; Informational statistics are recorded.

  • HEAVY; Informational, counter and timer statistics are recorded.

  • ALL; All statistics are recorded (this is the default).

Example 13-1 illustrates sample output from the Performance Monitor.

Example 13-1 Example Output

Performance Monitor:1279113281664
Operation     Value (ns)
Counter:CacheHits     1,375,664
Counter:CacheMisses     127
Counter:ClientSessionCreates     1,204,817
Counter:ConnectCalls     2
Counter:DataModifyQuery     48
Counter:DataModifyQuery:inventory     21
Counter:DataModifyQuery:order     27
Counter:DeleteObjectQuery     67,792
Counter:DeleteObjectQuery:Customer     1
Counter:ReadAllQuery     1,041,767.
Counter:ReadAllQuery:Item.findByCategory     733,827
Counter:ReadAllQuery:Item.findByCategory:CacheHits     733,779
Counter:ReadAllQuery:Item.findByCategory:CacheMisses     50
Counter:ReadObjectQuery     1,058,273
Counter:ReadObjectQuery:Item:item     130,063
Counter:ReadObjectQuery:Item:item:CacheHits     130,063
Counter:ReadObjectQuery:Item:item:CacheMisses     1
Counter:UnitOfWorkCommits     72,568
Counter:UnitOfWorkCreates     471,491
Counter:UnitOfWorkRollbacks     1
Counter:UpdateObjectQuery     71,498
Counter:UpdateObjectQuery:Customer     62,531
Info:LoginTime     Wed Jul 14 08:55:41 EDT 2010
Info:SessionName     file:/scratch/user_domains/servers/mt-1/app.jar
Timer:Caching     6,411,372,000
Timer:ConnectionManagement     17,225,641,000
Timer:DeleteObjectQuery     41,351,430,000
Timer:DeleteObjectQuery:Customer     4,441,000
Timer:DeleteObjectQuery:Customer:QueryPreparation     86,000
Timer:DeleteObjectQuery:Customer:SqlGeneration     28,000
Timer:DeleteObjectQuery:Customer:SqlPrepare     72,000
Timer:DeleteObjectQuery:Customer:StatementExecute     2,265,000
Timer:InsertObjectQuery     69,111,086,000
Timer:Logging     4,236,000
Timer:Merge     1,144,400,000
Timer:ObjectBuilding     31,914,397,000
Timer:QueryPreparation     984,396,000
Timer:ReadAllQuery     260,943,930,000
Timer:ReadAllQuery:Item:Item.findByCategory     14,790,333,000
Timer:ReadAllQuery:Item:Item.findByCategory:ObjectBuilding     250,959,000
Timer:ReadAllQuery:Item:Item.findByCategory:QueryPreparation     1,880,000
Timer:ReadAllQuery:Item:Item.findByCategory:RowFetch     113,552,000
Timer:ReadAllQuery:Item:Item.findByCategory:SqlGeneration     522,000
Timer:ReadAllQuery:Item:Item.findByCategory:SqlPrepare     2,055,000
Timer:ReadAllQuery:Item:Item.findByCategory:StatementExecute     107,382,000
Timer:Register     3,272,443,000
Timer:RowFetch     25,340,990,000
Timer:Sequencing     1,352,326,000
Timer:SqlGeneration     6,646,000
Timer:SqlPrepare     19,536,031,000
Timer:StatementExecute     508,589,220,000
Timer:TXAfterCompletion     1,854,152,000
Timer:TXBeforeCompletion     169,381,843,000
Timer:UnitOfWorkCommit     167,483,825,000
Timer:UpdateObjectQuery     46,440,589,000
Timer:UpdateObjectQuery:Customer     40,466,433,000
Timer:UpdateObjectQuery:Customer:QueryPreparation     867,496,000
Timer:UpdateObjectQuery:Customer:SqlGeneration     98,000
Timer:UpdateObjectQuery:Customer:SqlPrepare     1,319,333,000
Timer:UpdateObjectQuery:Customer:StatementExecute     32,901,366,000

13.4 Query Monitoring

Use the Query Monitor to measure query executions and cache hits. This can be useful for performance analysis in a complex system.

Enable the Query Monitor in either of these ways:

  • Set the System property org.eclipse.persistence.querymonitor=true.

  • In persistence.xml, set <property name="eclipselink.profiler" value="QueryMonitor"/>

The monitor dumps the number of query cache hits and executions (misses) once every 100 seconds.

For more information about querying, see Chapter 10, "Understanding Queries."