Injustice - Developers Among Us (SciFiDevCon 2024)
Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer Faces
1. Performance Tips and Tricks: Java
EE, Java Persistence API, and
JavaServer Faces
Alberto Lemos (Dr. Spock) Danival Taffarel Calegari
Senior Software Architect MATERA Systems Architect
Globalcode Instructor Globalcode Instructor
Globalcode – Open4education
2. Agenda
Motivation
Data recovery strategies
Lazy vs Eager
Cache
Web UI Design Strategies
Conversation Scope
View Helper + Persistence Service
Lazy UI Components
Globalcode – Open4education
3. Objective
“Present some tips and tricks on web
application development with JSF, Ajax,
and JPA”
Globalcode – Open4education
4. Motivation
JavaServer Faces (JSF) is a paradigm change in
Web development with Java EE;
It establishes a model for web UI components.
JSF evolved!
JSF 1.x (without AJAX) => Ineffective event oriented
JSF 1.x + AJAX lib => Event oriented
JSF 2.x => Event oriented
It's necessary to evolve the development
techniques on presentation and persistence layers!
Globalcode – Open4education
5. Agenda
Motivation
Data recovery strategies
Lazy vs Eager
Cache
Web UI Design Strategies
Conversation Scope
View Helper + Persistence Service
Lazy UI Components
Globalcode – Open4education
6. Lazy vs Eager
Strategies to handle the entity relationships;
Lazy: it fetches data on demand;
Eager: it always fetches data.
Globalcode – Open4education
7. Lazy vs Eager
Tip: JPA allows for a change from lazy to eager
using the JP-QL;
select distinct c from Categoria c join fetch c.produtos
It runs only one SELECT in the database;
Join fetch solves the N+1 problem;
Distinct should be used to avoid duplicated
results;
Note: this may cause problems with database
pagination.
Globalcode – Open4education
8. Lazy vs Eager
Tip: Try to paginate in database using lazy
strategy;
Use the setFirstResult and setMaxResults methods by
Query.
The JPA provider will use native database
commands to limit the query results;
Beware: join fetch for 1:N relationships causes
performance and memory problems.
WARN: firstResult/maxResults specified with collection
fetch; applying in memory!
Globalcode – Open4education
9. Lazy vs Eager
Tip: Try to use eager whenever bulk processing
data;
One common situation is report generation.
Be careful with memory use;
Do a previous query to get the ids and limit the results
with an in clause;
Use the clear method from EntityManager to remove
processed objects from memory.
Globalcode – Open4education
10. Cache
First level cache
While the EntityManager is open, it maitains the
references for all objects loaded by it;
This cache is erased when the clear method is called.
Second level cache
Maintains object references per EntityManagerFactory;
It is a per-application cache.
Globalcode – Open4education
12. Cache
Trick: By loading related entities into first level
cache before the main query, performance will
be greatly improved.
It can only work with N:1 relationships for entities with a
small number of instances.
Example: Fetching products with any filter.
If there are 200 categories, the lazy strategy should run
200 queries on the category table;
Execute a “select c from Category c” before querying for
products.
Globalcode – Open4education
13. Cache
Tip: Use second level cache to save memory
and to improve performance;
Choose non-frequent altered entities;
If an external application changes the database,
data in the second level cache will become
outdated.
Apply a time limit for data expiration.
Globalcode – Open4education
14. Agenda
Motivation
Data recovery strategies
Lazy vs Eager
Cache
Web UI Design Strategies
Conversation Scope
View Helper + Persistence Service
Lazy UI Components
Globalcode – Open4education
15. The Problem
DAO + JDBC => open/close connection;
DAO + Persistence Context => open/close session;
LazyInitializationException!
Globalcode – Open4education
16. Old Solution
OpenSessionInViewFilter Design Pattern;
New problems!
Globalcode – Open4education
17. New Problems
OpenSessionInViewFilter Design Pattern;
1st REQUEST 2nd REQUEST Nth REQUEST
Each request uses a different persistence context;
Session scoped entities can throw
LazyInitializationException!
Globalcode – Open4education
20. Web UI Strategies
Tip: Use the view and conversation scopes;
Avoid to use the session scope for objects with short
lifetime;
Usually the lifetime is managed by the container through
settings (Annotations or XML);
Globalcode – Open4education
21. Web UI Strategies
Tip: Store the persistence context into the view
scope or conversation scope;
The EntityManager remains open for a specified time;
Globalcode – Open4education
22. Web UI Strategies
Tip: Store the persistence context into the view
scope or conversation scope;
The EntityManager remains open for a specified time;
Enables the 1st level cache;
Prevents the LazyInitializationException errors;
Enables paging in the presentation tier Integrated with
the persistence tier;
Attention: The 1st level cache can increase for a long
term conversation scope.
Globalcode – Open4education
23. Web UI Strategies
Tip: Integrate the View Helper (pattern) with the
persistence service (JPA);
Implement a List (from Collections API) that receives a
Query object (from JPA);
Implement a DataModel (from JSF API) that receives a
Query object;
Implement an ExtendedTableDataModel (from
Richfaces API) that receives an EntityManager object;
Pagination: Use setFirtResult() and setMaxResults().
Be careful with eager fetching!
Filter and order by: Use CriteriaBuilder object (from
JPA).
Globalcode – Open4education
24. Web UI Strategies
Tip: Use UI Components that supports “lazy
loading” via Ajax;
Globalcode – Open4education
25. Web UI Strategies
Tip: Use UI Components that supports “lazy
loading” via Ajax;
Globalcode – Open4education
26. Web UI Strategies
Tip: Use UI Components that supports “lazy
loading” via Ajax;
Globalcode – Open4education
27. Sample Application
The tips and tricks are demonstrated by a sample
application;
It is avaliable to donwload at:
http://sourceforge.net/projects/j1catalogproto2/
Globalcode – Open4education