ADF Worst Practices (UKOUG Tech2013)
-
Upload
wilfred-van-der-deijl -
Category
Technology
-
view
3.577 -
download
2
description
Transcript of ADF Worst Practices (UKOUG Tech2013)
Worst Practices for Developing an ADF
ApplicationUKOUG ADF EMG Version 12.1.2.3.4.0.0b
Build WORST_PRACTICES_12.1.2.3.4.0.0b_UKOUG_2013 ADF EMG
S
Paco van der LindenAMISwww.adfplus.com@pavadeli
Wilfred van der DeijlThe Future Groupwww.redheap.com@wilfreddeijl
About us
S
Steven DavelaarOracleateam-oracle.com@stevendavelaar
Wilfred van der DeijlThe Future Groupwww.redheap.com@wilfreddeijl
About us
S
Ideal project
● 1 developer
That’s you of course!
S
Threats to a healthy ADF project
● Customer / Business / Functional designer
● Architect
● Project manager
S
Threats to a healthy ADF project
● Customer / Business / Functional designer
● Architect
● Project manager
● Other developers
● Graphic designer
S
Other Developers…Are not a member of ADF EMG
S
Other Developers…Do not use ADF EMG Taskflow Tester
S
ADF EMG Taskflow Tester - Wiki
S
ADF EMG Taskflow Tester
S
Other Developers… Don’t add ADF Source code library
● How to get ADF Source○ Go to support.oracle.com○ Log Service Request for JDeveloper/ADF○ “ADF Source Code Request” as problem type○ Sign agreement and upload to SR○ Get access to ZIP, typically within one day○ New versions don’t need new agreement
● Allows debugging of ADF framework
S
Other Developers… Don’t add ADF Source code library
S
Other Developers… Don’t adhere to ADF Code Guidelines
S
ADF Code Guidelines
● 38 pages of excellent content by ADF guru’s● Topics include:
○ General Code Guidelines○ ADF Business Components○ ADF Faces○ ADF TaskFlows○ ADF Binding Layer○ Security○ High Availability○ … and more
S
Other developers
● Don’t adhere to your project specific coding guidelines
● Other developers need your help○ Reserve time to review each other’s version control
commits○ You might learn from their code as well!!
● Reserve time to perform QA checks○ Against ADF coding guidelines and project specific
guidelines○ ...or automate this
■ come back tomorrow 10:15 - Exchange 6“Quality Assurance with JDev Auditing Framework”
S
Threats to a healthy ADF project
● Customer / Business / Functional designer
● Architect
● Project manager
● Other developers
● Graphic designer
W
W
W
W
W
W
W
Graphic designer - Pitfalls
● Website ≠ Application
● “HTML is for semantics, CSS is for layout…”○ ADF Fragment ≠ HTML, ADF skin ≠ CSS○ ADF Skin → primarily colours,
ADF Fragment → the rest
● Bad practice: CSS for layout management
W
ADF Skinning Tips
● Use stand-alone Skin Editor
● Use ADF component selectors○ don’t look at the generated HTML○ use ADF Faces Skin Selectors Tag Reference
● Choice○ UI Designer to learn ADF skinning (preferred choice)○ ADF developer to learn CSS
W
How to Write Code
W
Logging
● Bad practice: System.err.println()● Best practice: ADFLogger
○ Configure at Runtime without restart○ Analyze Log for Performance○ Time your own code○ Better insight into ADF Framework internals
W
ADFLogger - Runtime Configuration
W
ADFLogger - Runtime Configuration
W
ADFLogger - Log Analyzer
W
...or open log file from other (production) server
bit.ly/adflogger
Time custom code withADFLogger::begin andADFLogger::end
W
Understanding ADF Layers
● Bad: code ADF applications like open source frameworks
● What do we mean by that?○ All application state is kept in ViewController:○ Lots of data queried from ADF BC and stored in JSF
managed beans or entries in JSF memory scope maps
○ State passed back to ADF BC on subsequent requests: AM methods with lots of arguments
● Good: leverage ADF BC Active Data Model○ Easy access to previously entered data○ Row Currency management
S
Understanding ADF Layers
● Signs of ViewController doing ADF BC work○ import oracle.jbo…○ Iterating RowSets○ Storing lots of data in memory scopes or managed
beans. Should only contain true UI state○ Calling ApplicationModule methods with lots of
arguments even when using binding layer● Project Audits often show 50-80% of
ViewController code is unnecessary○ Either completely redundant○ ...or should be moved to ADF BC layer
S
ADF Facesa.k.a. the ViewController project
S
ADF Lifecycle - Immediate property
● Bad: I run into issues, let’s try immediate=true● Big difference: immediate on input component
vs input on command component● Almost always wrong in input components● Make sure you understand both JSF lifecycle
and ADF Optimized Lifecycle
● Steven Davelaar’s 18 Lessons○ also available as ADF Insider Video
bit.ly/jsf-lifecycle
S
Know your ADF Memory Scopes
● Bad: Overuse of SessionScope & PageFlowScope
● Can have significant impact on mem usage● Good: The smaller, the better● Do not cache shorter living objects
○ Should be cheap to request each time when needed○ Can have disastrous consequences, for example
caching binding objects
S
S
Extreme Disastrous Caching
S
Extreme Disastrous Caching
Memory Scopes Guidelines
● SessionScope○ only use for user context○ often (UTF) PageFlowScope is better
■ Two browser tabs share SessionScope but have independent UTF PageFlowScope
● RequestScope○ often BackingBeanScope is better○ each ADF Region or Declarative Component has own
BackingBeanScope but share RequestScope● Bad: Accessing SessionScope beans from BTF
○ BTF should be reusable and not rely on SessionScope○ taskflow parameters are there for a reason○ Use ADF EMG TaskFlow Tester to ensure
independence
S
“My ADF application is memory hungry”
We might have a (small) part of the solution
W
JSF Component BindingJDeveloper Generated Code
<af:inputText binding=”#{pageFlowScope.MyBean.lastName}”/>
W
JSF Component Binding
● First ask yourself if it is really needed● binding=”#{pageFlowScope.MyBean.lastName}”
references UIComponent in PageFlow bean● UIComponents should be released after each
request● But Managed Bean might require
PageFlowScope for its functionality
W
JSF Component BindingComponentReference
W
Enhancement Request logged
“My JSF Component seems to travel around”
W
Building Component Tree
bit.ly/compbind
binding attribute
create component
call getter
call setter
create component
use component
No
Yes
Not Null
Null
W
a.k.a. the Model project
ADF Business Components
W
ADF BC Data Model - Master DetailBeware of excessive querying
Navigate row here...
Requery(if populated)
S
ADF BC Data Model - Master DetailPrevent excessive querying
● Use top level ViewObject instances with bind variables
● or reset detail ViewObject on master row navigation
S
bit.ly/masterdetail
ADF BC Data Model - Master DetailPrevent excessive querying
S
“I encountered a dramatic ADF bug!!!Sometimes users lose entered data when the
application is under heavy load.”
W
Disable Application Module Pooling
W
Don’t Simply passivate all!
W
“ADF has huge performance problems!!!When under heavy load requests can take
several minutes.”
“Besides, what is this PS_TXN table for? It is eating up our tablespace.”
W
Don’t Simply Passivate All
● Every ViewRow with transient atts is persisted
● During activation all state is applied
W
Simply passivate all?
○ Every ViewRow with transient atts is persisted
○ During activation all state is applied
No!
W
What is passivated?
○ Set logger:oracle.jbo.server.Serializer
○ To:
S
What is passivated?
○ Set logger:oracle.jbo.server.Serializer
○ To:
W
“My ADF application is hacked!!!Sometimes users see data from other
sessions.”
“By the way, I did test the application with AM pooling off.”
W
Application Module RecyclingNot Losing, but Leaking state
● AM Instances Recycled for other users under load
● Not detected by disabling AM pooling!
W
Detecting State Leakage
W
Default AM Pool Tuning
W
Default ViewObject TuningW
Eclipse Memory Analyzer Tool
bit.ly/eclipsemat
W
Eclipse Memory Analyzer Tool (MAT)
● Make heap dump of running serverJDK_HOME/bin/jmap -dump:file=path jvm_process_id
● Download and run standalone Eclipse MAT● Inspect all objects in heap● Query Heap Objects● Predefined Reports and Tools
bit.ly/eclipsemat
W
Java Mission Control
bit.ly/miscontrol
W
Java Mission Control
● Any version of JRockit● Hotspot (aka Sun JVM) since 1.7.0_40● Record a period of time● Analyze
○ CPU performance○ Memory Usage○ Garbage Collection○ Thread Concurrency○ etcetera
W
Miscellaneous
W
Password management
● Bad: Credentials in clear text (eg. web.xml)● Worse: Override with deployment plans
bit.ly/secure-adf
W
Reading Credential Store
bit.ly/secure-adf
W
Load/Stress Testing
● 5 developers on a Friday afternoon:“Ready…. Set…. Go”
● Every ADF project initially has performance issues
● Consider ○ JMeter - Free open source, not optimized for ADF○ Oracle Application Testing Suite - ADF aware
● Requires○ Production like testing environment○ Good knowledge of chosen test tool○ 10 days setup (assuming test tool experience)
S
Further Reading● bit.ly/adflogger
○ ADFLogger Custom Timings● bit.ly/secure-adf
○ FMW Credential Store● bit.ly/eclipsemat
○ Memory Analyzer Tool● bit.ly/miscontrol
○ Java Mission Control● bit.ly/jsf-lifecycle
○ Steven Davelaar’s JSF Lifecycle Lessons● bit.ly/compbind
○ JSF Component Bindings● bit.ly/masterdetail
○ Lazy Master Detail Query
S
That’s all folks!
S