On Apr 10, 2007, at 10:15 AM, Pablo Oliveira wrote:
On Apr 09, Ludovic Dubost wrote :
Right.. the XWikiContext with the classCache and
archiveCache
(which are
needed) is not made for being use for too long without cleaning up..
Maybe there should be some automated cleaning up when it gets too
big..
A simple non invasive solution, would be to use a LRUMap instead
of a simple HashMap.
It can be set to a maximum size and will use a Least Recently Used
elimination
when full and adding a new object. See patch below.
Looks very good to me Pablo.
Some other things to take into account:
1) I see there's this method in XWikiContext:
public BaseClass getBaseClass(String name) {
return (BaseClass) classCache.get(name);
}
This is too dangerous. I've checked and it's only used internally by
XWikiContext.getClass(). It's dangerous because if we have a LRU
strategy it could return null if some piece of code uses it. I
believe this method should be removed altogether and the get from the
map should be done directly in the getClass() method.
2) In XWikiHibernateVersioningStore, there's:
// This will also make sure that the Archive has a
strong reference
// and will not be discarded as long as the context
exists.
context.addDocumentArchive(key, archivedoc);
This will no longer be true. I'm not sure who wrote this comment and
why it's good that a strong reference is kept during the whole
lifecycle of the context... Whoever did this please come forward to
explain! :)
3) Arnaud, do you think you could try what you've done with Pablo's
patch and tell how it went? We need some verifications that it works
fine before applying it.
4) Last, it would be great if someone could create a jira issue and
attach pablo's patch
Thanks
-Vincent
Index:
core/src/main/java/com/xpn/xwiki/XWikiContext.java
===================================================================
--- core/src/main/java/com/xpn/xwiki/XWikiContext.java (revision
2320)
+++ core/src/main/java/com/xpn/xwiki/XWikiContext.java (working copy)
@@ -31,6 +31,7 @@
import com.xpn.xwiki.web.*;
import com.xpn.xwiki.validation.XWikiValidationStatus;
import org.apache.xmlrpc.server.XmlRpcServer;
+import org.apache.commons.collections.map.LRUMap;
import java.net.URL;
import java.util.*;
@@ -65,11 +66,13 @@
private String wikiOwner;
private XWikiDocument wikiServer;
private int cacheDuration = 0;
+ private int classCacheSize = 10;
+ private int archiveCacheSize = 10;
// Used to avoid recursive loading of documents if there are
recursives usage of classes
- private Map classCache = new HashMap();
+ private Map classCache = new LRUMap(classCacheSize);
// Used to avoir reloading archives in the same request
- private Map archiveCache = new HashMap();
+ private Map archiveCache = new LRUMap(archiveCacheSize);
--
Pablo
--
You receive this message as a subscriber of the xwiki-
dev(a)objectweb.org mailing list.
To unsubscribe: mailto:xwiki-dev-unsubscribe@objectweb.org
For general help: mailto:sympa@objectweb.org?subject=help
ObjectWeb mailing lists service home page:
http://www.objectweb.org/
wws