]
Pete Muir commented on JBSEAM-3655:
-----------------------------------
It's the only way.
Caching in ServerConversationContext
-------------------------------------
Key: JBSEAM-3655
URL:
https://jira.jboss.org/jira/browse/JBSEAM-3655
Project: Seam
Issue Type: Bug
Components: Core
Reporter: Michael Youngstrom
Assignee: Michael Youngstrom
Fix For: 2.1.1.CR1
In my application profiling the SeamELResolver is an extremely hot spot.
ServerConversationContext was the hottest. I think it would be safe to create a request
scoped cache on ServerCovnersationContext. I believe nobody can really be add or removing
values from the conversation without going through the ServerConversationContext. In my
tests caching resolution of conversation values greatly improved EL performance.
Index: src/main/org/jboss/seam/contexts/ServerConversationContext.java
===================================================================
--- src/main/org/jboss/seam/contexts/ServerConversationContext.java (revision 9465)
+++ src/main/org/jboss/seam/contexts/ServerConversationContext.java (working copy)
@@ -36,6 +36,7 @@
private final Set<String> removals = new HashSet<String>();
private final String id;
private final List<String> idStack;
+ private final Map<String, Object> cache = new HashMap<String, Object>();
private List<String> getIdStack()
{
@@ -81,8 +82,15 @@
this.idStack = new LinkedList<String>();
idStack.add(id);
}
+
+ public Object get(String name) {
+ if (!cache.containsKey(name)) {
+ cache.put(name, resolveValue(name));
+ }
+ return cache.get(name);
+ }
- public Object get(String name)
+ protected Object resolveValue(String name)
{
Object result = additions.get(name);
if (result!=null)
@@ -148,6 +156,7 @@
public void set(String name, Object value)
{
if ( Events.exists() )
Events.instance().raiseEvent("org.jboss.seam.preSetVariable." + name);
+ cache.remove(name);
if (value==null)
{
//yes, we need this
@@ -185,6 +194,7 @@
public void remove(String name)
{
if ( Events.exists() )
Events.instance().raiseEvent("org.jboss.seam.preRemoveVariable." + name);
+ cache.remove(name);
additions.remove(name);
removals.add(name);
if ( Events.exists() )
Events.instance().raiseEvent("org.jboss.seam.postRemoveVariable." + name);
@@ -245,6 +255,7 @@
public void clear()
{
+ cache.clear();
additions.clear();
removals.addAll( getNamesFromSession() );
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: