[JBoss Seam] - Enhance s:cache performances
by Zerg-Spirit
Hi!
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.
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:
<!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()}" />
| <br />
| <br />
| <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}" />
| <br />
| <ui:include src="/layout/alphabetLinks.xhtml"/>
| <br />
| <ul>
| <table id ="thesaurusResultTable">
| <tr>
| <c:forEach items="#{topicHome.instance.sortedColumnedChildren}"
| var="superList">
| <td>
| <c:forEach items="#{superList}" var="list">
| <c:forEach items="#{list}" var="t">
| <a name="#{t.name.substring(0,1)}" />
| <f:subview >
| <li><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>)</li>
| <ui:include src="/showChild.xhtml">
| <ui:param name="topic" value="#{t}" />
| </ui:include>
| </f:subview>
| </c:forEach>
| <br />
| </c:forEach></td>
| </c:forEach>
|
| </tr>
| </table>
|
| </ul>
| </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:
| <c:forEach items="#{topic.children}" var="t">
| <f:subview>
| <ul>
| <li><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>)</li>
|
| <ui:include src="/showChild.xhtml">
| <ui:param name="topic" value="#{t}" />
| </ui:include>
|
| </ul>
| </f:subview>
| </c:forEach>
Then, finally, my treecache.xml config file:
| <?xml version="1.0" encoding="UTF-8"?>
|
| <!-- ===================================================================== -->
| <!-- -->
| <!-- PojoCache Service Configuration -->
| <!-- -->
| <!-- ===================================================================== -->
|
| <server>
|
| <!-- Used inside JBoss AS
| <classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/>
| -->
|
| <!-- ==================================================================== -->
| <!-- Defines configuration -->
| <!-- ==================================================================== -->
|
| <mbean code="org.jboss.cache.aop.PojoCache" name="jboss.cache:service=testPojoCache">
|
| <!-- Used inside JBoss AS -->
| <depends>jboss:service=Naming</depends>
| <depends>jboss:service=TransactionManager</depends>
|
| <!--
| Configure the TransactionManager
| <attribute name="TransactionManagerLookupClass">org.jboss.cache.DummyTransactionManagerLookup</attribute>
| -->
|
| <!--
| Node locking scheme:
| OPTIMISTIC
| PESSIMISTIC (default)
| -->
| <attribute name="NodeLockingScheme">PESSIMISTIC</attribute>
|
| <!--
| Note that this attribute is IGNORED if your NodeLockingScheme above is OPTIMISTIC.
|
| Isolation level : SERIALIZABLE
| REPEATABLE_READ (default)
| READ_COMMITTED
| READ_UNCOMMITTED
| NONE
| -->
| <attribute name="IsolationLevel">REPEATABLE_READ</attribute>
|
| <!--
| Valid modes are LOCAL
| REPL_ASYNC
| REPL_SYNC
| INVALIDATION_ASYNC
| INVALIDATION_SYNC
| -->
| <attribute name="CacheMode">LOCAL</attribute>
|
| <!-- Name of cluster. Needs to be the same for all clusters, in order
| to find each other
| -->
| <attribute name="ClusterName">Sample-Cluster</attribute>
|
| <!-- JGroups protocol stack properties. Can also be a URL,
| e.g. file:/home/bela/default.xml
| <attribute name="ClusterProperties"></attribute>
| -->
|
| <attribute name="ClusterConfig">
| <config>
| <!-- 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" />
| </config>
| </attribute>
|
|
| <!--
| 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
| -->
| <attribute name="InitialStateRetrievalTimeout">20000</attribute>
|
| <!--
| Number of milliseconds to wait until all responses for a
| synchronous call have been received.
| -->
| <attribute name="SyncReplTimeout">15000</attribute>
|
| <!-- Max number of milliseconds to wait for a lock acquisition -->
| <attribute name="LockAcquisitionTimeout">10000</attribute>
|
| <!-- Name of the eviction policy class. We have commented it off to disable eviction.
| -->
| <attribute name="EvictionPolicyClass">org.jboss.cache.aop.eviction.AopLRUPolicy</attribute>
|
| <!-- Specific eviction policy configurations. This is LRU -->
| <attribute name="EvictionPolicyConfig">
| <config>
| <attribute name="wakeUpIntervalSeconds">5</attribute>
| <!-- Cache wide default -->
| <region name="/_default_">
| <attribute name="maxNodes">5000</attribute>
| <attribute name="timeToLiveSeconds">5</attribute>
| </region>
| <region name="/aop">
| <attribute name="maxNodes">5</attribute>
| <attribute name="timeToLiveSeconds">4</attribute>
| </region>
| <region name="/pojo">
| <attribute name="maxNodes">100</attribute>
| <attribute name="timeToLiveSeconds">4</attribute>
| </region>
| <region name="/Topic">
| <attribute name="maxNodes">5000</attribute>
| <attribute name="timeToLiveSeconds">10000</attribute>
| <attribute name="maxAgeSeconds">1800</attribute>
| </region>
| </config>
| </attribute>
| </mbean>
|
| </server>
I guess there's something wrong with my config file or something, though I'm not sure and couldn't find something related to it in the 'not-so-friendly' jboss cache's documentation.
Thanks for your help.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4107977#4107977
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4107977
18 years, 7 months
[JBossCache] - Warning of TX rollback
by aih1013
Hello!
We use JbossCache 1.4.1.SP4 as Hibernate 2nd level cache in pessimistic READ_COMMITTED mode.
After TX is setRollbackOnly(true), Jboss Cache emits following warning.
It looks little frustrating, as rollback is normal situation, IMHO. Does the warning reports about a hidden problem?
| 2007-11-27 03:55:03,640 WARN [org.jboss.cache.TreeCache] status is 4 (not ACTIVE or PREPARING); returning null)
| java.lang.Throwable
| at org.jboss.cache.TreeCache.getCurrentTransaction(TreeCache.java:5819)
| at org.jboss.cache.TreeCache.getCurrentTransaction(TreeCache.java:5789)
| at org.jboss.cache.TreeCache.remove(TreeCache.java:3867)
| at org.hibernate.cache.TreeCache.clear(TreeCache.java:121)
| at org.hibernate.cache.TransactionalCache.clear(TransactionalCache.java:124)
| at org.hibernate.impl.SessionFactoryImpl.evictEntity(SessionFactoryImpl.java:830)
| at org.hibernate.action.BulkOperationCleanupAction.evictEntityRegions(BulkOperationCleanupAction.java:132)
| at org.hibernate.action.BulkOperationCleanupAction.afterTransactionCompletion(BulkOperationCleanupAction.java:111)
| at org.hibernate.engine.ActionQueue.afterTransactionCompletion(ActionQueue.java:170)
| at org.hibernate.impl.SessionImpl.afterTransactionCompletion(SessionImpl.java:424)
| at org.hibernate.jdbc.JDBCContext.afterTransactionCompletion(JDBCContext.java:225)
| at org.hibernate.transaction.CacheSynchronization.afterCompletion(CacheSynchronization.java:85)
| at org.jboss.tm.TransactionImpl.doAfterCompletion(TransactionImpl.java:1526)
| at org.jboss.tm.TransactionImpl.completeTransaction(TransactionImpl.java:1198)
| at org.jboss.tm.TransactionImpl.rollback(TransactionImpl.java:413)
| at org.jboss.tm.TxManager.rollback(TxManager.java:364)
| at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.rollback(ServerVMClientUserTransaction.java:148)
| at org.springframework.transaction.jta.JtaTransactionManager.doRollback(JtaTransactionManager.java:863)
| at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:742)
| at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:604)
| at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:311)
| at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
| at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
| at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:203)
| at $Proxy65.applyChanges(Unknown Source)
| at com.stravati.server.invoker.services.ISyncServiceInvoker$applyChangesMethodInvoker.runMethod(ISyncServiceInvoker.java:118)
| at com.stravati.server.invoker.services.ISyncServiceInvoker.invokeServiceMethod(ISyncServiceInvoker.java:85)
| at com.stravati.server.invoker.Invoker$1.run(Invoker.java:41)
| at com.stravati.server.security.ApiContextImpl$1.run(ApiContextImpl.java:116)
| at com.stravati.server.security.ImpersonationController.impersonate(ImpersonationController.java:60)
| at com.stravati.server.security.ImpersonationController.impersonate(ImpersonationController.java:122)
| at com.stravati.server.security.ApiContextImpl.run(ApiContextImpl.java:110)
| at com.stravati.server.invoker.Invoker.invoke(Invoker.java:35)
| at com.stravati.server.adapter.rest.RestAdapter.handleRequestInternal(RestAdapter.java:49)
| at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
| at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
| at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:839)
| at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:774)
| at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:460)
| at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:425)
| at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
| at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
| at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
| at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
| at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
| at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
| at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
| at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
| at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
| at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
| at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
| at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
| at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
| at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
| at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:216)
| at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
| at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:216)
| at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
| at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:108)
| at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
| at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)
| at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:90)
| at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
| at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
| at com.stravati.server.web.forward.RootRedirectionFilter.doFilter(RootRedirectionFilter.java:63)
| at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
| at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
| at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
| at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
| at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
| at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
| at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
| at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
| at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
| at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
| at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
| at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
| at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
| at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
| at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199)
| at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)
| at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
| at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
| at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
| at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
| at java.lang.Thread.run(Thread.java:595)
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4107976#4107976
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4107976
18 years, 7 months
[JBoss Portal] - Re: Data access / persistence - could you help?
by Antoine_h
This is an hibernate problem, not a portal problem...
may be look on hibernate forum (no need to post : easy problem, you 'll find an answer yet in the forum).
globally : the portal is in JBoss
the access to DB is done with "usual" j2ee features... not really in the portal.
look at the user portlet, and all the portlet that manage the identity (user, roles, etc...).
it is a good example how to get all this in a portlet.
(and the portlet/portal does not really care of that... it is more a hibernate/j2ee feature...)
just think of adding the "transaction" in your portlet definition (jboss-portlet.xml).
this to provide a transaction injection for all the portlet sub process...
this may not be requiered if you use ejb (ejb3...). but it is a "classic" problem when starting with portlets and DB.
see the way the definition of user portlet, cms portlet... are done in the portal...
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4107973#4107973
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4107973
18 years, 7 months