improve s:cache performances
zerg-spirit Dec 7, 2007 5:21 AMHi, I already posted this message in the Seam forums, but I figured it was most probably a topic that would fit here.
I'm currently working on a big page displaying a topic and every of its children hierarchically.
Since these topics can have a lot of children, I figured out I should cache my page to enhance my performances.
I actually managed to cache it, jumping from a poor 40s~ page generation time to a big but-still-not-great enhancement to 6s.
Thanks to a sysout, I've also noticed that when a cached page is rendered, my backing bean is being used!
I actually don't understand why it takes so much time, since as far as I understood, the whole page should be cached, so it should basically result to a 'static page', ie. almost an instant loading.
Here's the code:
Code:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.ajax4jsf.org/rich"
xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
xmlns:c="http://java.sun.com/jstl/core"
template="/layout/template.xhtml">
<ui:define name="body">
<s:cache key="#{topicHome.instance}" region="/Topic" enabled="true">
<h:form>
<s:link value="#{messages['lrb.message.back_to_main_list']}" view="/Thesaurus.xhtml"/>
<h:outputText value=" | " />
<h:inputText value="#{searchTopic}" />
<h:commandButton value="#{messages['lrb.action.search']}"
action="#{thesaurusManager.searchTopic()}" />
<h:commandLink action="#{thesaurusManager.showTopic(topicHome.instance)}"
value="#{topicHome.instance.name}" />
<h:commandLink
action="#{thesaurusManager.selectTopic(topicHome.instance)}"
value="(#{topicHome.instance.relatedBooks} #{messages['lrb.thesaurus.hits']})"
rendered="#{topicHome.instance.relatedBooks.intValue() != 0}" />
<ui:include src="/layout/alphabetLinks.xhtml"/>
<c:forEach items="#{topicHome.instance.sortedColumnedChildren}"
var="superList">
<c:forEach items="#{superList}" var="list">
<c:forEach items="#{list}" var="t">
<f:subview >
<s:link view="/showTopic" value="#{t.name}" propagation="nest"> <f:param name="topicId" value="#{t.id}" /> </s:link>
(<s:link value="#{t.relatedBooks} #{messages['lrb.thesaurus.hits']}" view="/showBooks" propagation="nest"> <f:param name="topicId" value="#{t.id}"/> </s:link>)
<ui:include src="/showChild.xhtml">
<ui:param name="topic" value="#{t}" />
</ui:include>
</f:subview>
</c:forEach>
</c:forEach>
</c:forEach>
</h:form>
</s:cache>
</ui:define>
</ui:composition>
This page is the main one, the one I surrounded with s:cache tag.
Then showChild is called recursively to load every children:
Code:
<c:forEach items="#{topic.children}" var="t">
<f:subview>
<s:link view="/showTopic" value="#{t.name}" propagation="nest"> <f:param name="topicId" value="#{t.id}" /> </s:link> (<s:link value="#{t.relatedBooks} #{messages['lrb.thesaurus.hits']}" view="/showBooks" propagation="nest"> <f:param name="topicId" value="#{t.id}"/> </s:link>)
<ui:include src="/showChild.xhtml">
<ui:param name="topic" value="#{t}" />
</ui:include>
</f:subview>
</c:forEach>
Then, finally, my treecache.xml config file:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===================================================================== -->
<!-- -->
<!-- PojoCache Service Configuration -->
<!-- -->
<!-- ===================================================================== -->
<!-- Used inside JBoss AS
-->
<!-- ==================================================================== -->
<!-- Defines configuration -->
<!-- ==================================================================== -->
<!-- Used inside JBoss AS -->
jboss:service=Naming
jboss:service=TransactionManager
<!--
Configure the TransactionManager
org.jboss.cache.DummyTransactionManagerLookup
-->
<!--
Node locking scheme:
OPTIMISTIC
PESSIMISTIC (default)
-->
PESSIMISTIC
<!--
Note that this attribute is IGNORED if your NodeLockingScheme above is OPTIMISTIC.
Isolation level : SERIALIZABLE
REPEATABLE_READ (default)
READ_COMMITTED
READ_UNCOMMITTED
NONE
-->
REPEATABLE_READ
<!--
Valid modes are LOCAL
REPL_ASYNC
REPL_SYNC
INVALIDATION_ASYNC
INVALIDATION_SYNC
-->
LOCAL
<!-- Name of cluster. Needs to be the same for all clusters, in order
to find each other
-->
Sample-Cluster
<!-- JGroups protocol stack properties. Can also be a URL,
e.g. file:/home/bela/default.xml
-->
<!-- UDP: if you have a multihomed machine,
set the bind_addr attribute to the appropriate NIC IP address -->
<!-- UDP: On Windows machines, because of the media sense feature
being broken with multicast (even after disabling media sense)
set the loopback attribute to true -->
<UDP mcast_addr="228.1.2.5" mcast_port="45577" ip_ttl="64" ip_mcast="true" mcast_send_buf_size="150000"
mcast_recv_buf_size="80000" ucast_send_buf_size="150000" ucast_recv_buf_size="80000" loopback="false" />
<PING timeout="2000" num_initial_members="3" up_thread="false" down_thread="false" />
<MERGE2 min_interval="10000" max_interval="20000" />
<FD shun="true" up_thread="true" down_thread="true" />
<VERIFY_SUSPECT timeout="1500" up_thread="false" down_thread="false" />
<pbcast.NAKACK gc_lag="50" retransmit_timeout="600,1200,2400,4800" up_thread="false" down_thread="false" />
<pbcast.STABLE desired_avg_gossip="20000" up_thread="false" down_thread="false" />
<UNICAST timeout="600,1200,2400" window_size="100" min_threshold="10" down_thread="false" />
<FRAG frag_size="8192" down_thread="false" up_thread="false" />
<pbcast.GMS join_timeout="5000" join_retry_timeout="2000" shun="true" print_local_addr="true" />
<pbcast.STATE_TRANSFER up_thread="false" down_thread="false" />
<!--
The max amount of time (in milliseconds) we wait until the
initial state (ie. the contents of the cache) are retrieved from
existing members in a clustered environment
-->
20000
<!--
Number of milliseconds to wait until all responses for a
synchronous call have been received.
-->
15000
<!-- Max number of milliseconds to wait for a lock acquisition -->
10000
<!-- Name of the eviction policy class. We have commented it off to disable eviction.
-->
org.jboss.cache.aop.eviction.AopLRUPolicy
<!-- Specific eviction policy configurations. This is LRU -->
5
<!-- Cache wide default -->
5000
5
5
4
100
4
5000
10000
1800
I guess there's something wrong with my config file or something,
Thanks for your help.