<div dir="ltr">These are my findings during my investigation of the &quot;IntitialContext.lookup&quot; calls.&nbsp; Remember from my previous email that all lookups are routed through the &quot;org.jboss.seam.util.Naming&quot; class.<br>

<br>Where do we do JNDI lookups?<br>---------------------------------------<br>Below are all of the places in the code where Seam performs these look ups:<br><br>* org.jboss.seam.bpm.Jbpm.initJbpmConfiguration()*<br>&nbsp; &nbsp; - Naming.getInitialContext().lookup(jbpmConfigurationJndiName); <br>

&nbsp;&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/bpm/Jbpm.java?r=8728#l114" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/bpm/Jbpm.java?r=8728#l114</a><br>


<br>* org.jboss.seam.jms.ManagedQueueSender.getQueue()*<br>&nbsp;&nbsp;&nbsp; - Naming.getInitialContext().lookup(queueJndiName);<br>&nbsp;&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/jms/ManagedQueueSender.java?r=6665#l45" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/jms/ManagedQueueSender.java?r=6665#l45</a><br>

<br>* org.jboss.seam.jms.ManagedTopicPublisher.getTopic()*
<br>&nbsp;&nbsp; - Naming.getInitialContext().lookup(topicJndiName);<br>&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/jms/ManagedTopicPublisher.java?r=6665#l47" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/jms/ManagedTopicPublisher.java?r=6665#l47</a><br>

<br>* org.jboss.seam.jms.QueueConnection.getQueueConnectionFactory()*<br>&nbsp;&nbsp; - Naming.getInitialContext().lookup(queueConnectionFactoryJndiName);<br>&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/jms/QueueConnection.java?r=6665#l64" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/jms/QueueConnection.java?r=6665#l64</a><br>

&nbsp;<br>* org.jboss.seam.jms.TopicConnection.getTopicConnectionFactory()*<br>

&nbsp;&nbsp; - Naming.getInitialContext().lookup(topicConnectionFactoryJndiName);<br>&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/jms/TopicConnection.java?r=6665#l64" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/jms/TopicConnection.java?r=6665#l64</a><br>

<br>* org.jboss.seam.mail.MailSession.getSession()*<br>&nbsp;&nbsp; - Naming.getInitialContext().lookup(getSessionJndiName());<br>&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/mail/MailSession.java?r=9149#l64" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/mail/MailSession.java?r=9149#l64</a><br>

<br> * org.jboss.seam.persistence.ManagedHibernateSession.getSessionFactoryFromJndiOrValueBinding()*<br>

&nbsp;&nbsp; - Naming.getInitialContext().lookup(sessionFactoryJndiName);<br>&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/persistence/ManagedHibernateSession.java?r=9081#l240" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/persistence/ManagedHibernateSession.java?r=9081#l240</a><br>

&nbsp;<br>* org.jboss.seam.persistence.ManagedPersistenceContext.getEntityManagerFactoryFromJndiOrValueBinding()*<br>&nbsp;&nbsp; - Naming.getInitialContext().lookup(persistenceUnitJndiName);<br>&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/persistence/ManagedPersistenceContext.java?r=9081#l228" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/persistence/ManagedPersistenceContext.java?r=9081#l228</a><br>



<br>* org.jboss.seam.transaction.Transaction.getUserTransaction()*<br>&nbsp;&nbsp; - Naming.getInitialContext();<br>&nbsp;&nbsp; - context.lookup(&quot;java:comp/UserTransaction&quot;);<br>&nbsp;&nbsp; - context.lookup(&quot;UserTransaction&quot;);<br>

&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/transaction/Transaction.java?r=5875#l76" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/transaction/Transaction.java?r=5875#l76</a><br>



<br>* org.jboss.seam.util.EJB.getEJBContext()*<br>&nbsp;&nbsp; - Naming.getInitialContext().lookup(ejbContextName);<br>&nbsp;&nbsp; - Naming.getInitialContext().lookup(STANDARD_EJB_CONTEXT_NAME);<br>&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/util/EJB.java?r=8908#l81" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/util/EJB.java?r=8908#l81</a><br>

<br>* org.jboss.seam.Component.instantiateSessionBean()*<br>

&nbsp;&nbsp; - Naming.getInitialContext().lookup(jndiName);<br>&nbsp;&nbsp; - <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/Component.java?r=9122#l1320" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/Component.java?r=9122#l1320</a><br>

<br>JNDI Lookups<br>---------------------<br>The important thing to investigate is who the the big culprit(s) are - who is making all the lookups.&nbsp; We all obviously had our suspicions, and they were right.&nbsp; <br><br>
A single user making a single request to the Seam user forum front page performs 114 JNDI lookups for &quot;java:comp/UserTransation&quot;.&nbsp; This means that not only are 144 instances of IntialContext created, but we have 114 actual lookups as well.&nbsp; This is nearly linear with 2 requests creating 228 JNDI lookups + some for ajax4jsf caching calls as described below.&nbsp; Extrapolating to the 25 user test that would be 25x114=2850 jndi lookups for each round of requests.&nbsp; <br>

<br>At least for the wiki page I am testing there were no other JNDI lookups.<br><br>Who is looking up &quot;java:comp/UserTransation&quot;<br>--------------------------------------------------------<br>All of these calls can be traced to Transaction.instance().&nbsp; I broke down all of the calls to Transaction.instance() during a single request to the user forum page on the wiki.&nbsp;&nbsp; <br>

 <br>81 - seam.util.Work.workInTransaction(Work.java:34) via (TransactionInterceptor.java:34)<br>&nbsp; 1 - SeamPhaseListener.handleTransactionsBeforePhase(SeamPhaseListener.java:319)<br>&nbsp; 3 - SeamPhaseListener.begin(SeamPhaseListener.java:591)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>

&nbsp; 3 - SeamPhaseListener.begin(SeamPhaseListener.java:594)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; 3 - SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:611)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; 3 - SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:614)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>

&nbsp; 8 - ManagedPersistenceContext.joinTransaction(ManagedPersistenceContext.java:120)<br>&nbsp; 6 - Contexts.flushAndDestroyContexts(Contexts.java:331)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; 6 - ManagedPersistenceContext.close(ManagedPersistenceContext.java:192)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>

-------------<br>114 - Total<br><br>I then broke it down by which JSF lifecycle phase it was done in.<br><br>Phase Breakdown:<br>------------------<br>3&nbsp;&nbsp; - During RESTORE_VIEW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>2&nbsp;&nbsp; - Between RESTORE_VIEW and RENDER_RESPONSE <br>

91 - During RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>18 - After RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>----------<br>114 total<br><br>I then did the same break down on a second follow up request with the same session<br><br>
Second Request showed a different distribution:<br>
------------------------------------------------<br>3&nbsp;&nbsp; - During RESTORE_VIEW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>2&nbsp;&nbsp; - Between RESTORE_VIEW and RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>91 - During RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>5&nbsp;&nbsp; - After RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>

3&nbsp;&nbsp; - During 2nd RESTORE_VIEW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>0&nbsp;&nbsp; - Between 2nd RESTORE_VIEW and RENDER_RESPONSE&nbsp; <br>1&nbsp;&nbsp; - During 2nd RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>3&nbsp;&nbsp; - After 2nd RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>

3&nbsp;&nbsp; - During 3rd RESTORE_VIEW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>0&nbsp;&nbsp; - Between 3rd RESTORE_VIEW and RENDER_RESPONSE&nbsp; <br>1&nbsp;&nbsp; - During 3rd RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>16 - After 3rd RENDER_RESPONSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>

------------ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>128 total<br><br>The extra 14 lookups are all during the extra 2 mini requests.&nbsp; They all pass through this ajax4jsf class &quot;org.ajax4jsf.resource.ResourceLifecycle.invokePhaseListener(ResourceLifecycle.java:[199/201])&quot;.&nbsp; I&#39;m assuming that these extra calls are related to page fragment caching and/or resources that are provided through the ajax4jsf InternetResourceService.&nbsp; Christian can you confirm?<br>

<br>Conclusions:<br>---------------------<br>We obviously need to find more ways to improve this behavior.&nbsp; The primary offender is &quot;Work.java&quot; (see: <a href="http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/util/Work.java?r=8624#l34" target="_blank">http://fisheye.jboss.org/browse/Seam/trunk/src/main/org/jboss/seam/util/Work.java?r=8624#l34</a> ).&nbsp; This single line is checking if the transaction is currently active.&nbsp; 81 time it is active and processing continues as normal.&nbsp; Is there a way we can cache this value for the length of the request (either the transaction, or the result)?&nbsp; Caching the result could be bad if something changed during the request, so we would need the actual transaction.<br>

<br>Also many of the lookups were the result of EL processing during the RENDER_RESPONSE phase.&nbsp; Ideally these would primarily be read-only requests or close to it.&nbsp; Could there be a way to disable the transactional calls for items somehow tagged read only?&nbsp; I have not give that much thought yet so it might need some flushing out ;-)<br>
<br>These finding just cover the wiki application.&nbsp; We need to do similar investigations with other applications like dvdstore and chatroom to exercise some of the other areas.&nbsp; <br><br>More to come, but any comments suggestions, or ideas for improving this are welcome :-)<br>

<br>-Jay<br><br>-- <br>blog: <a href="http://in.relation.to/Bloggers/Jay" target="_blank">http://in.relation.to/Bloggers/Jay</a><br>
</div>