Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer Faces

8,566 views
8,362 views

Published on

Slides from our session for JavaOne USA (San Francisco) 2010.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,566
On SlideShare
0
From Embeds
0
Number of Embeds
5,177
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Performance Tips and Tricks: Java EE, Java Persistence API and JavaServer Faces

  1. 1. Performance Tips and Tricks: Java EE, Java Persistence API, and JavaServer FacesAlberto Lemos (Dr. Spock) Danival Taffarel Calegari Senior Software Architect MATERA Systems Architect Globalcode Instructor Globalcode Instructor Globalcode – Open4education
  2. 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. 3. Objective “Present some tips and tricks on webapplication development with JSF, Ajax, and JPA” Globalcode – Open4education
  4. 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 Its necessary to evolve the development techniques on presentation and persistence layers! Globalcode – Open4education
  5. 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. 6. Lazy vs Eager Strategies to handle the entity relationships; Lazy: it fetches data on demand; Eager: it always fetches data. Globalcode – Open4education
  7. 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. 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. 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. 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
  11. 11. Cache Globalcode – Open4education
  12. 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. 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. 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. 15. The Problem DAO + JDBC => open/close connection; DAO + Persistence Context => open/close session; LazyInitializationException! Globalcode – Open4education
  16. 16. Old Solution OpenSessionInViewFilter Design Pattern; New problems! Globalcode – Open4education
  17. 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
  18. 18. Web 1.0 Request-oriented web applications; Globalcode – Open4education
  19. 19. Web 2.0 AJAX-oriented web applications; Globalcode – Open4education
  20. 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. 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. 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. 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. 24. Web UI Strategies Tip: Use UI Components that supports “lazy loading” via Ajax; Globalcode – Open4education
  25. 25. Web UI Strategies Tip: Use UI Components that supports “lazy loading” via Ajax; Globalcode – Open4education
  26. 26. Web UI Strategies Tip: Use UI Components that supports “lazy loading” via Ajax; Globalcode – Open4education
  27. 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
  28. 28. Thank you!Alberto Lemos (Dr. Spock) Danival Taffarel Calegarihttp://www.globalcode.com.br/ http://www.matera.com/spock@globalcode.com.br danival@globalcode.com.brhttp://twitter.com/drspockbr http://twitter.com/danivaltc Globalcode – Open4education

×