[jbossseam-issues] [JBoss JIRA] Created: (JBSEAM-3655) Caching in ServerConversationContext

Michael Youngstrom (JIRA) jira-events at lists.jboss.org
Thu Oct 30 17:14:20 EDT 2008


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: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the seam-issues mailing list