There is a large problem with data context variables if they are bound dynamically.
They will be recomputed again and again, even when in Partial Execution mode and if they are not in use. Here is a small demo XPage:
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:this.dataContexts> <xp:dataContext var="dataContext"> <xp:this.value> <![CDATA[#{javascript: // Sleep for 100ms java.lang.Thread.currentThread().sleep( 100 ); print('-=> Recalc: ' + java.lang.System.currentTimeMillis()); return true; }]]> </xp:this.value> </xp:dataContext> </xp:this.dataContexts> <xp:label id="labelRefreshMe"> <xp:this.value> <![CDATA[#{javascript: java.lang.System.currentTimeMillis() }]]> </xp:this.value> </xp:label> <xp:button value="Refresh" id="buttonRefresh" > <xp:eventHandler event="onclick" submit="false" refreshMode="partial" refreshId="labelRefreshMe" execId="labelRefreshMe" execMode="partial" /> </xp:button> </xp:view>
If you are open the XPage, a dataContext variable will be recalculated for three times:
Clicking on the button will recalculate them up to eleven times:
Keep in mind: Partial Refresh & Partial Execution is enabled. That makes them only useable if their values are computed on page load.
if you wrap your code with a
xp:panel id=“pnl1″ tagName=“div“
you can reduce the amount of recalcs to at least 4
Thanks for the info. But there is still the problem that the variables will be recalculated while partial execution should prevent this behaviour…
not sure, if this can solve the dilemma, but it cuts down the number of recalcs to 1 on refresh . a dark hack it is …
Recalc: ' + java.lang.System.currentTimeMillis());
requestScope.calcDataContext = false
return true;
}
}]]>
Yeah, I remember running across this and being surprised about how frequently they’re re-computed. I like dataContext variables sometimes, but I tend to stick to ${}-binding for this reason.
I’d definitely agree with using dataContexts for computed on page load.
Your stats confused me a bit because you were getting more messages than I found when I did my session at BLUG, DanNotes and UKLUG. But I then found the reason. My dataContext was bound to a panel, not to the XPage itself. It cuts the calls from 3 to 2 on page load and by half on refresh. I don’t know why, and I wonder if there’s scope for better optimisation of the XPages runtime. (It’s probably working as designed at the moment, but maybe not as well as it could.)
If you have the same rendered property on more than one component on an XPage, I’d recommend dataContexts. In a panel it performs fractionally worse than that same rendered property directly on the component. But it’s significantly better than the same rendered property on two controls and it’s also means one reference to update if changes are required.
Pingback: In Ya Facet! | blog@hasselba.ch