You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2005/07/25 01:56:11 UTC
cvs commit: db-ojb/src/java/org/apache/ojb/broker PersistenceBrokerFactory.java
arminw 2005/07/24 16:56:11
Modified: src/java/org/apache/ojb/broker/core Tag: OJB_1_0_RELEASE
PersistenceBrokerFactoryBaseImpl.java
PersistenceBrokerFactoryDefaultImpl.java
PersistenceBrokerFactoryIF.java
PersistenceBrokerThreadMapping.java
src/java/org/apache/ojb/broker Tag: OJB_1_0_RELEASE
PersistenceBrokerFactory.java
Log:
add shutdown method to solve problems with re/hotdeployment of OJB in servlet/ejb-container, see user list thread (OJB ThreadLocal usage and reuse of thread instances in appServer)
http://www.mail-archive.com/ojb-user%40db.apache.org/msg14002.html
Revision Changes Path
No revision
No revision
1.3.2.2 +17 -1 db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerFactoryBaseImpl.java
Index: PersistenceBrokerFactoryBaseImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerFactoryBaseImpl.java,v
retrieving revision 1.3.2.1
retrieving revision 1.3.2.2
diff -u -r1.3.2.1 -r1.3.2.2
--- PersistenceBrokerFactoryBaseImpl.java 7 May 2005 16:51:09 -0000 1.3.2.1
+++ PersistenceBrokerFactoryBaseImpl.java 24 Jul 2005 23:56:11 -0000 1.3.2.2
@@ -19,6 +19,7 @@
import org.apache.ojb.broker.PBKey;
import org.apache.ojb.broker.PersistenceBroker;
import org.apache.ojb.broker.PersistenceBrokerInternal;
+import org.apache.ojb.broker.accesslayer.ConnectionFactoryFactory;
import org.apache.ojb.broker.metadata.MetadataManager;
import org.apache.ojb.broker.util.BrokerHelper;
import org.apache.ojb.broker.util.ClassHelper;
@@ -185,4 +186,19 @@
{
return 0;
}
+
+ public void shutdown()
+ {
+ try
+ {
+ ConnectionFactoryFactory.getInstance().createConnectionFactory().releaseAllResources();
+ PersistenceBrokerThreadMapping.shutdown();
+ MetadataManager.getInstance().shutdown();
+ }
+ catch(RuntimeException e)
+ {
+ log.error("Error while shutdown of OJB", e);
+ throw e;
+ }
+ }
}
1.11.2.2 +18 -5 db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerFactoryDefaultImpl.java
Index: PersistenceBrokerFactoryDefaultImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerFactoryDefaultImpl.java,v
retrieving revision 1.11.2.1
retrieving revision 1.11.2.2
diff -u -r1.11.2.1 -r1.11.2.2
--- PersistenceBrokerFactoryDefaultImpl.java 7 May 2005 16:51:09 -0000 1.11.2.1
+++ PersistenceBrokerFactoryDefaultImpl.java 24 Jul 2005 23:56:11 -0000 1.11.2.2
@@ -159,16 +159,29 @@
super.releaseAllInstances();
try
{
- brokerPool.clear();
- // TODO: should we setup a new pool instance?
- //brokerPool = this.createPool();
+ brokerPool.close();
+ brokerPool = this.createPool();
}
catch (Exception e)
{
- log.error("Clearing of broker pool failed", e);
+ log.error("Error while release all pooled broker instances and refresh pool", e);
}
}
+ public void shutdown()
+ {
+ try
+ {
+ brokerPool.close();
+ brokerPool = null;
+ }
+ catch(Exception e)
+ {
+ log.error("Error while shutdown of broker pool", e);
+ }
+ super.shutdown();
+ }
+
public int activePersistenceBroker()
{
return brokerPool.getNumActive();
1.4.2.2 +11 -1 db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerFactoryIF.java
Index: PersistenceBrokerFactoryIF.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerFactoryIF.java,v
retrieving revision 1.4.2.1
retrieving revision 1.4.2.2
diff -u -r1.4.2.1 -r1.4.2.2
--- PersistenceBrokerFactoryIF.java 7 May 2005 16:51:09 -0000 1.4.2.1
+++ PersistenceBrokerFactoryIF.java 24 Jul 2005 23:56:11 -0000 1.4.2.2
@@ -89,4 +89,14 @@
* instances.
*/
public int activePersistenceBroker();
+
+ /**
+ * Shutdown method for OJB, kills all running processes within OJB - after
+ * shutdown OJB can no longer be used.
+ * <br/>
+ * This method is introduced to solve hot/redeployment problems (memory leaks) caused by
+ * the usage of {@link ThreadLocal} instances in OJB source and the reuse of threads
+ * by the container (e.g. servlet- or ejb-container).
+ */
+ public void shutdown();
}
1.6.2.2 +63 -14 db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerThreadMapping.java
Index: PersistenceBrokerThreadMapping.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerThreadMapping.java,v
retrieving revision 1.6.2.1
retrieving revision 1.6.2.2
diff -u -r1.6.2.1 -r1.6.2.2
--- PersistenceBrokerThreadMapping.java 7 May 2005 16:51:09 -0000 1.6.2.1
+++ PersistenceBrokerThreadMapping.java 24 Jul 2005 23:56:11 -0000 1.6.2.2
@@ -15,7 +15,9 @@
* limitations under the License.
*/
+import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.WeakHashMap;
@@ -35,26 +37,42 @@
public class PersistenceBrokerThreadMapping
{
/**
+ * A Collection of all HashMaps added to the <CODE>ThreadLocal currentBrokerMap</CODE> that are still -alive-.
+ * If all the PersistenceBrokers are always correctly closed, the Collection should remain empty.
+ * The Collection is iterated trough when calling the <CODE>shutdown()</CODE> method and all the maps that are
+ * still alive will be cleared.
+ */
+ private static Collection loadedHMs = new HashSet();
+
+ /**
* The hashmap that maps PBKeys to current brokers for the thread
- **/
+ */
private static ThreadLocal currentBrokerMap = new ThreadLocal();
+ /**
+ * Mark a PersistenceBroker as preferred choice for current Thread
+ *
+ * @param key The PBKey the broker is associated to
+ * @param broker The PersistenceBroker to mark as current
+ */
public static void setCurrentPersistenceBroker(PBKey key, PersistenceBrokerInternal broker)
- throws PBFactoryException
+ throws PBFactoryException
{
HashMap map = (HashMap) currentBrokerMap.get();
WeakHashMap set = null;
- if (map == null)
+ if(map == null)
{
map = new HashMap();
currentBrokerMap.set(map);
+
+ loadedHMs.add(map);
}
else
{
set = (WeakHashMap) map.get(key);
}
- if (set == null)
+ if(set == null)
{
// We emulate weak HashSet using WeakHashMap
set = new WeakHashMap();
@@ -63,17 +81,32 @@
set.put(broker, null);
}
+ /**
+ * Unmark a PersistenceBroker as preferred choice for current Thread
+ *
+ * @param key The PBKey the broker is associated to
+ * @param broker The PersistenceBroker to unmark
+ */
public static void unsetCurrentPersistenceBroker(PBKey key, PersistenceBrokerInternal broker)
- throws PBFactoryException
+ throws PBFactoryException
{
HashMap map = (HashMap) currentBrokerMap.get();
WeakHashMap set = null;
- if (map != null)
+ if(map != null)
{
set = (WeakHashMap) map.get(key);
- if (set != null)
+ if(set != null)
{
set.remove(broker);
+ if(set.isEmpty())
+ {
+ map.remove(key);
+ }
+ }
+ if(map.isEmpty())
+ {
+ currentBrokerMap.set(null);
+ loadedHMs.remove(map);
}
}
}
@@ -81,42 +114,58 @@
/**
* Return the current open {@link org.apache.ojb.broker.PersistenceBroker}
* instance for the given {@link org.apache.ojb.broker.PBKey}, if any.
+ *
* @param key
* @return null if no open {@link org.apache.ojb.broker.PersistenceBroker} found.
*/
public static PersistenceBrokerInternal currentPersistenceBroker(PBKey key)
- throws PBFactoryException, PersistenceBrokerException
+ throws PBFactoryException, PersistenceBrokerException
{
HashMap map = (HashMap) currentBrokerMap.get();
WeakHashMap set;
PersistenceBrokerInternal broker = null;
- if (map == null)
+ if(map == null)
{
return null;
}
set = (WeakHashMap) map.get(key);
- if (set == null)
+ if(set == null)
{
return null;
}
// seek for an open broker, preferably in transaction
- for (Iterator it = set.keySet().iterator(); it.hasNext(); )
+ for(Iterator it = set.keySet().iterator(); it.hasNext();)
{
PersistenceBrokerInternal tmp = (PersistenceBrokerInternal) it.next();
- if (tmp == null || tmp.isClosed())
+ if(tmp == null || tmp.isClosed())
{
it.remove();
continue;
}
broker = tmp;
- if (tmp.isInTransaction())
+ if(tmp.isInTransaction())
{
break; // the best choice found
}
}
return broker;
}
+
+ /**
+ * Clean up static fields and any registered ThreadLocal contents to grant a clean
+ * shutdown/reload of OJB within re/hot-deployable applications.
+ */
+ public static void shutdown()
+ {
+ for(Iterator it = loadedHMs.iterator(); it.hasNext();)
+ {
+ ((HashMap) it.next()).clear();
+ }
+ loadedHMs.clear();
+ loadedHMs = null;
+ currentBrokerMap = null;
+ }
}
No revision
No revision
1.23.2.1 +9 -1 db-ojb/src/java/org/apache/ojb/broker/PersistenceBrokerFactory.java
Index: PersistenceBrokerFactory.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/PersistenceBrokerFactory.java,v
retrieving revision 1.23
retrieving revision 1.23.2.1
diff -u -r1.23 -r1.23.2.1
--- PersistenceBrokerFactory.java 4 Apr 2004 23:53:30 -0000 1.23
+++ PersistenceBrokerFactory.java 24 Jul 2005 23:56:11 -0000 1.23.2.1
@@ -93,4 +93,12 @@
{
PersistenceBrokerFactoryFactory.instance().releaseAllInstances();
}
+
+ /**
+ * @see org.apache.ojb.broker.core.PersistenceBrokerFactoryIF#shutdown()
+ */
+ public static void shutdown()
+ {
+ PersistenceBrokerFactoryFactory.instance().shutdown();
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org