]
Michael Youngstrom commented on JBSEAM-3655:
--------------------------------------------
Hmm.....so it appears to me that this may be a bug in Seam already. If you call
initializeTemporaryConversation() and you've added a bean to the conversation context
and then call "initializeTemporaryConversation()" then that temporary
conversation will return the recently added bean from the previous conversation. Does
that correct? If so perhaps it makes sense to call
((ServerConversationContext)Contexts.getConversationContext()).clear(); in
initializeTemporaryConversation regardless of the caching. What do you think? If that
makes sense I may create a separate issue for that and check a fix in under that issue.
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, 2.1.1.CR2
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: