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

Michael Youngstrom (JIRA) jira-events at lists.jboss.org
Fri Oct 31 10:56:30 EDT 2008


    [ https://jira.jboss.org/jira/browse/JBSEAM-3655?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12436491#action_12436491 ] 

Michael Youngstrom commented on JBSEAM-3655:
--------------------------------------------

And I believe all of the Context objects are essentially request scoped.  The get created at the beginning of the request in something like FacesLifecycle.beginRequest() and destroyed in FacesLifecycle.endRequest().  So I believe we can assume this object doesn't need to be thread safe.  It already isn't thread safe since its usinng HashMaps for the additions and removals Maps.

The main question with this change is if it's possible to add or remove something from a conversation in the middle of a request without going through this Context object.

> 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