Thanks a lot Danilo, we've noticed this very same leak but thought it is a
Tomcat problem and simply accepted that after 3-5 redeployments the server must
be restarted! Your first patch seems to be OK for us as we don't apply proxies
either.
-- Ilkka
Danilo Tommasina wrote:
Hi again, and sorry for spamming the mailinglist :)
Here is some code that can be applied to
org.apache.ojb.broker.core.PersistenceBrokerThreadMapping to clean up the
ThreadLocal stuff to be able to cleanly
shutdown/reload a web-application without leaks in the PermGen. Using following
code will no longer needs the workaround suggested in my previous mail.
Add a new static field to the class:
private static java.util.ArrayList loadedHMs = new java.util.ArrayList();
Modifiy the following method
public static void setCurrentPersistenceBroker(PBKey key, PersistenceBroker
broker)
throws PBFactoryException
{
HashMap map = (HashMap) currentBrokerMap.get();
WeakHashMap set = null;
if (map == null)
{
map = new HashMap();
currentBrokerMap.set(map);
loadedHMs.add( map ); // ------------------ HERE IS IT
}
else
{
set = (WeakHashMap) map.get(key);
}
if (set == null)
{
// We emulate weak HashSet using WeakHashMap
set = new WeakHashMap();
map.put(key, set);
}
set.put(broker, null);
}
Add this new method:
/** Clean up static fields and any registered ThreadLocal contents to
cleanly shutdown/reload OJB
* within web-applications
*/
public static void shutdown()
{
for ( Iterator it = loadedWHM.iterator(); it.hasNext(); )
{
((HashMap) it.next()).clear();
}
loadedHMs.clear();
loadedHMs = null;
currentBrokerMap = null;
}
The PersistenceBrokerThreadMapping.shutdown() method must be called in your
'web application shutdown interceptor'.
Since there are other routines in OJB that should be called when shutting down
a web-application it would be nice to have a central method for doing this.
Further routines that should be called are:
// Release all persistence broker instances
- PersistenceBrokerFactory.releaseAllInstances();
// Release all (pooled) db connections
-
ConnectionFactoryFactory.getInstance().createConnectionFactory().releaseAllResources();
- And stop any eviction Thread that is still running in background (see my
first post)
Please note that there are other ThreadLocal variables that are used in OJB
depending on the config. Maybe it is also necessary to clean-up these variables
(I
did not test it)
- MetadataManager.threadedRepository
- MetadataManager.currentProfileKey
- JTATxManager.txRepository
Hopefully this can be of any help.
bye
danilo
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]