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 ma...@apache.org on 2003/02/03 00:30:02 UTC
cvs commit: jakarta-ojb/src/java/org/apache/ojb/broker/singlevm PersistenceBrokerImpl.java
mattbaird 2003/02/02 15:30:02
Modified: src/java/org/apache/ojb/broker/singlevm
PersistenceBrokerImpl.java
Log:
make the registration maps member variables to reduce overhead of creating the maps on each transaction. Also simplified the API a bit.
Revision Changes Path
1.122 +125 -154 jakarta-ojb/src/java/org/apache/ojb/broker/singlevm/PersistenceBrokerImpl.java
Index: PersistenceBrokerImpl.java
===================================================================
RCS file: /home/cvs//jakarta-ojb/src/java/org/apache/ojb/broker/singlevm/PersistenceBrokerImpl.java,v
retrieving revision 1.121
retrieving revision 1.122
diff -u -r1.121 -r1.122
--- PersistenceBrokerImpl.java 2 Feb 2003 03:39:19 -0000 1.121
+++ PersistenceBrokerImpl.java 2 Feb 2003 23:30:02 -0000 1.122
@@ -92,7 +92,6 @@
import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.MtoNQuery;
import org.apache.ojb.broker.query.Query;
-import org.apache.ojb.broker.query.QueryByCriteria;
import org.apache.ojb.broker.query.QueryByIdentity;
import org.apache.ojb.broker.query.QueryBySQL;
import org.apache.ojb.broker.query.QueryFactory;
@@ -129,9 +128,10 @@
* and allows to store and retrieve arbitrary objects in/from relational
* databases accessed by JDBC.
*
- * @see test.org.apache.ojb.tutorial1.Application for a sample application
+ * @see org.apache.ojb.tutorial1.Application for a sample application
* @author <a href="mailto:thma@apache.org">Thomas Mahler<a>
* @author <a href="mailto:leandro@ibnetwork.com.br">Leandro Rodrigo Saad Cruz<a>
+ * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird<a>
* @version $Id$
*/
public class PersistenceBrokerImpl extends PersistenceBrokerAbstractImpl implements PBState
@@ -169,6 +169,13 @@
private BrokerHelper brokerHelper;
private PBKey pbKey;
+ /**
+ * Maps for object registration during store and delete operations. We reuse these maps to avoid excessive object
+ * creation.
+ */
+ private Map m_markedForStore;
+ private Map m_markedForDelete;
+
protected PersistenceBrokerImpl()
{
}
@@ -329,6 +336,7 @@
{
throw new TransactionNotInProgressException();
}
+ clearRegistrationMaps();
this.connectionManager.localRollback();
}
@@ -363,6 +371,8 @@
{
throw new TransactionNotInProgressException();
}
+ clearRegistrationMaps();
+
this.connectionManager.localCommit();
}
@@ -371,7 +381,57 @@
*/
public void delete(Object obj) throws PersistenceBrokerException
{
- delete(obj, new HashMap());
+ //logger.info("DELETING " + obj);
+ // only delete if object is not null
+ if (obj != null)
+ {
+ obj = ProxyHelper.getRealObject(obj);
+ /**
+ * MBAIRD
+ * 1. if we are marked for delete already, avoid recursing on this object
+ */
+ if (m_markedForDelete != null)
+ {
+ if (m_markedForDelete.containsKey(obj))
+ {
+ return;
+ }
+ }
+ else
+ {
+ /**
+ * Optimization: Lazily instantiate the markedForDelete Map.
+ */
+ m_markedForDelete = new HashMap();
+ }
+ /**
+ * MBAIRD
+ * 2. register object in markedForDelete map.
+ */
+ m_markedForDelete.put(obj, obj);
+
+ // Invoke events on PersistenceBrokerAware instances and listeners
+ fireBrokerEvent(obj, EVENT_BEFORE_DELETE);
+
+ ClassDescriptor cld = descriptorRepository.getDescriptorFor(obj.getClass());
+ // 1. delete dependend collections
+ if (cld.getCollectionDescriptors().size() > 0)
+ {
+ deleteCollections(obj, cld.getCollectionDescriptors());
+ }
+ // 2. delete object from directly mapped table
+ dbAccess.executeDelete(cld, obj); // use obj not oid to delete, BRJ
+ // 3. delete dependend upon objects last to avoid FK violations
+ if (cld.getObjectReferenceDescriptors().size() > 0)
+ {
+ deleteReferences(obj, cld.getObjectReferenceDescriptors());
+ }
+ // remove obj from the object cache:
+ objectCache.remove(new Identity(obj, this, cld));
+
+ // Invoke events on PersistenceBrokerAware instances and listeners
+ fireBrokerEvent(obj, EVENT_AFTER_DELETE);
+ }
}
/**
@@ -437,53 +497,6 @@
}
/**
- * Internal delete will not recurse infinitely.
- * @param obj
- * @param markedForDelete
- * @throws PersistenceBrokerException
- */
- private void delete(Object obj, Map markedForDelete) throws PersistenceBrokerException
- {
- //logger.info("DELETING " + obj);
-
- // only delete if object is not null
- if (obj != null)
- {
- obj = ProxyHelper.getRealObject(obj);
- /**
- * MBAIRD
- * 1. if we are marked for delete already, avoid recursing on this object
- */
- if (markedForDelete.containsKey(obj))
- {
- return;
- }
- /**
- * MBAIRD
- * 2. register object in markedForDelete map.
- */
- markedForDelete.put(obj, obj);
-
- // Invoke events on PersistenceBrokerAware instances and listeners
- fireBrokerEvent(obj, EVENT_BEFORE_DELETE);
-
- ClassDescriptor cld = descriptorRepository.getDescriptorFor(obj.getClass());
- // 1. delete dependend collections
- deleteCollections(obj, cld.getCollectionDescriptors(), markedForDelete);
- // 2. delete object from directly mapped table
- Identity oid = new Identity(obj, this, cld);
- dbAccess.executeDelete(cld, obj); // use obj not oid to delete, BRJ
- // 3. delete dependend upon objects last to avoid FK violations
- deleteReferences(obj, cld.getObjectReferenceDescriptors(), markedForDelete);
- // remove obj from the object cache:
- objectCache.remove(oid);
-
- // Invoke events on PersistenceBrokerAware instances and listeners
- fireBrokerEvent(obj, EVENT_AFTER_DELETE);
- }
- }
-
- /**
* Deletes references that <b>obj</b> points to.
* All objects which we have a FK poiting to (Via ReferenceDescriptors) will be deleted if auto-delete is true <b>AND</b>
* the member field containing the object reference if NOT null.
@@ -492,7 +505,7 @@
* @param vecRds vector of ObjectRederenceDescriptors
* @throws PersistenceBrokerException if some goes wrong - please see the error message for details
*/
- private void deleteReferences(Object obj, Vector vecRds, Map markedForDelete) throws PersistenceBrokerException
+ private void deleteReferences(Object obj, Vector vecRds) throws PersistenceBrokerException
{
// get all members of obj that are references and delete them
Iterator i = vecRds.iterator();
@@ -507,7 +520,7 @@
//logger.info("DELETING refence for "+obj);
//logger.info("DELETING refence "+rds.getItemClass()+"="+referencedObject);
- delete(referencedObject, markedForDelete);
+ delete(referencedObject);
}
}
}
@@ -522,7 +535,7 @@
* @param vecCds vector of ObjectRederenceDescriptors
* @throws PersistenceBrokerException if some goes wrong - please see the error message for details
*/
- private void deleteCollections(Object obj, Vector vecCds, Map markedForDelete) throws PersistenceBrokerException
+ private void deleteCollections(Object obj, Vector vecCds) throws PersistenceBrokerException
{
// get all members of obj that are collections and
// delete all their elements
@@ -570,7 +583,7 @@
}
while (colIterator.hasNext())
{
- delete(colIterator.next(), markedForDelete);
+ delete(colIterator.next());
}
}
}
@@ -596,12 +609,7 @@
*/
public void store(Object obj) throws PersistenceBrokerException
{
- store(obj, new HashMap());
- }
-
- private void store(Object obj, Map markedForStore)
- {
- // only do something if obj != null
+ // only do something if obj != null
if (obj != null)
{
// ProxyObjects only have to be updated if their real subjects have been loaded
@@ -622,14 +630,14 @@
doInsert = true;
// now store it:
}
- store(obj, oid, cld, doInsert, markedForStore);
+ store(obj, oid, cld, doInsert);
}
// if Object == null do nothing
else
{
return;
}
- }
+ }
/**
* Store all object references that <b>obj</b> points to.
@@ -639,7 +647,7 @@
* @param obj Object which we will store references for
* @param vecRds - Vector with all ObjectReferenceDescriptors that should be stored
*/
- private void storeReferences(Object obj, Vector vecRds, Map markedForStore)
+ private void storeReferences(Object obj, Vector vecRds)
{
// get all members of obj that are references and store them
Iterator i = vecRds.iterator();
@@ -649,7 +657,7 @@
Object ref = rds.getPersistentField().get(obj);
if (rds.getCascadeStore())
{
- store(ref, markedForStore);
+ store(ref);
}
else
{
@@ -716,7 +724,7 @@
* @param vecCds vector of ObjectRederenceDescriptors
* @throws PersistenceBrokerException if some goes wrong - please see the error message for details
*/
- private void storeCollections(Object obj, Vector vecCds, Map markedForStore) throws PersistenceBrokerException
+ private void storeCollections(Object obj, Vector vecCds) throws PersistenceBrokerException
{
// get all members of obj that are collections and store all their elements
Iterator i = vecCds.iterator();
@@ -774,7 +782,7 @@
if (cds.isMtoNRelation())
{
// 1. Store depended upon object first to avoid FK violation
- storeCollectionObject(cds, otherObj, markedForStore);
+ storeCollectionObject(cds, otherObj);
// 2. Store indirection record
storeMtoNImplementor(cds, obj, otherObj, currentMtoNKeys);
}
@@ -782,7 +790,7 @@
else
{
assertFkAssignment(otherObj, obj, cds);
- storeCollectionObject(cds, otherObj, markedForStore);
+ storeCollectionObject(cds, otherObj);
}
}
}
@@ -797,12 +805,12 @@
* @param cds CollectionDescriptor providing metadata about the collection in which <b>otherObject</b> is part of
* @throws PersistenceBrokerException if some goes wrong - please see the error message for details
*/
- private void storeCollectionObject(CollectionDescriptor cds, Object otherObject, Map markedForStore)
+ private void storeCollectionObject(CollectionDescriptor cds, Object otherObject)
{
// if cascade store: store associated object
if (cds.getCascadeStore())
{
- store(otherObject, markedForStore);
+ store(otherObject);
}
}
@@ -1181,8 +1189,6 @@
{
return null;
}
-
- id = new Identity(referencedClass, pkVals);
if (rds.isLazy())
{
referencedProxy = getClassDescriptor(referencedClass).getDynamicProxyClass();
@@ -1196,7 +1202,7 @@
{
try
{
- return VirtualProxy.createProxy(getPBKey(), referencedProxy, id);
+ return VirtualProxy.createProxy(getPBKey(), referencedProxy, new Identity(referencedClass, pkVals));
}
catch (Exception e)
{
@@ -1206,7 +1212,7 @@
}
else
{
- return getObjectByIdentity(id);
+ return getObjectByIdentity(new Identity(referencedClass, pkVals));
}
}
@@ -1328,25 +1334,6 @@
}
/**
- * retrieve a collection of itemClass Objects matching the Query query
- * @param itemClass Class of item in collection
- * @param query the query
- */
- private Collection getCollectionFromQuery(Class itemClass, Query query) throws ClassNotPersistenceCapableException
- {
- if (logger.isDebugEnabled()) logger.debug("getCollectionByQuery " + itemClass + ", " + query);
-
- ClassDescriptor cld = descriptorRepository.getDescriptorFor(itemClass);
- Vector res = new Vector();
- Iterator i = getIteratorFromQuery(query, cld);
- while (i.hasNext())
- {
- res.add(i.next());
- }
- return res;
- }
-
- /**
*
* retrieve a collection of type collectionClass matching the Query query
*
@@ -1566,43 +1553,6 @@
}
/**
- * Helper method that analyses que pathElement of a query to see if we need to
- * perform multiple queries on the database using a different Criteria every time to join the right tables
- * <b>OBS</b> : this method was introduced in order to get Extent Aware Iterators.
- * @param pathElement - path Element belonging to cld which we will search Class objects for
- * @return a List of Class objects
- */
- private List getClassObjectsForPathElement(ClassDescriptor cld,String pathElement)
- {
- ObjectReferenceDescriptor ord;
- List concreteClasses = new ArrayList();
- Class referencedClass;
- List descriptors = cld.getAttributeDescriptorsForPath(pathElement);
-
- if (!descriptors.isEmpty())
- {
- // BRJ: we need only the last segment of the path
- ord = (ObjectReferenceDescriptor)descriptors.get(descriptors.size() - 1);
-
- referencedClass = ord.getItemClass();
-
- //OBS pathElement should equal ord.getAttributeName()
- logger.debug(" --* Attribute descriptor for pathElement ["+ord.getAttributeName()+"] found");
-
- // BRJ: the referenced class may be concrete
- if (!descriptorRepository.getDescriptorFor(referencedClass).isAbstract())
- {
- concreteClasses.add(referencedClass);
- }
-
- concreteClasses.addAll(descriptorRepository.getConcreteSubclassesOf(referencedClass));
- }
-
- return concreteClasses;
- }
-
-
- /**
* Method declaration
*
* @param id
@@ -1694,11 +1644,6 @@
*/
public void store(Object obj, ObjectModification mod) throws PersistenceBrokerException
{
- store(obj, mod, new HashMap());
- }
-
- private void store(Object obj, ObjectModification mod, Map markedForStore) throws PersistenceBrokerException
- {
obj = ProxyHelper.getRealObject(obj);
ClassDescriptor cld = descriptorRepository.getDescriptorFor(obj.getClass());
// this call ensures that all autoincremented primary key attributes are filled
@@ -1706,11 +1651,11 @@
// select flag for insert / update selection by checking the ObjectModification
if (mod.needsInsert())
{
- store(obj, oid, cld, true, markedForStore);
+ store(obj, oid, cld, true);
}
else if (mod.needsUpdate())
{
- store(obj, oid, cld, false, markedForStore);
+ store(obj, oid, cld, false);
}
else
{
@@ -1730,7 +1675,7 @@
* use update cascading to referenced objects.
*
*/
- private void store(Object obj, Identity oid, ClassDescriptor cld, boolean insert, Map markedForStore)
+ private void store(Object obj, Identity oid, ClassDescriptor cld, boolean insert)
{
// Invoke events on PersistenceBrokerAware instances and listeners
fireBrokerEvent(obj, EVENT_BEFORE_STORE);
@@ -1739,24 +1684,35 @@
{
/**
* MBAIRD
- * 1. if we are marked for delete already, avoid recursing on this object
+ * 1. if we are marked for store already, avoid recursing on this object
* do this AFTER we check if it's a proxy and it's materialized otherwise we will
* materialize the proxy by putting it in the map.
*/
- if (markedForStore.containsKey(obj))
- {
- Boolean insertUpdateMarker = (Boolean) markedForStore.get(obj);
- if (insertUpdateMarker.booleanValue() == insert)
- {
- return;
- }
- }
+ if (m_markedForStore != null)
+ {
+ if (m_markedForStore.containsKey(obj))
+ {
+ Boolean insertUpdateMarker = (Boolean) m_markedForStore.get(obj);
+ if (insertUpdateMarker.booleanValue() == insert)
+ {
+ return;
+ }
+ }
+ }
+ else
+ {
+ /**
+ * optimization: only initialize when we need to.
+ */
+ m_markedForStore = new HashMap();
+ }
+
/**
* MBAIRD
* 2. register object in markedForStore map with proper marker (insert flag)
*/
- markedForStore.put(obj, new Boolean(insert));
- storeToDb(obj, cld, oid, markedForStore, insert);
+ m_markedForStore.put(obj, new Boolean(insert));
+ storeToDb(obj, cld, oid, m_markedForStore, insert);
}
else
{
@@ -1788,7 +1744,7 @@
// if using db auto_increment (ex: SequenceManagerMySQLImpl)
assignReferenceFKs(obj, cld.getObjectReferenceDescriptors());
// 2. store references (1:1) associations to avoid FK violations
- storeReferences(obj, cld.getObjectReferenceDescriptors(), markedForStore);
+ storeReferences(obj, cld.getObjectReferenceDescriptors());
// setreferenceFKs for auto_inc dbs - this can be ignored by hi low or any that do pre assignment
try
@@ -1845,7 +1801,7 @@
// objectCache.cache(obj);
objectCache.cache(oid, obj);
// 4. store 1:n and m:n associations
- storeCollections(obj, cld.getCollectionDescriptors(), markedForStore);
+ storeCollections(obj, cld.getCollectionDescriptors());
}
}
@@ -1941,7 +1897,7 @@
// objectCache.cache(obj);
LoadedObjectsRegistry.register(obj);
// 4. store 1:n and m:n associations
- storeCollections(obj, cld.getCollectionDescriptors(), markedForStore);
+ storeCollections(obj, cld.getCollectionDescriptors());
}
}
@@ -1987,7 +1943,7 @@
for (int i = 0; i < fields.length; i++)
{
- FieldDescriptor fld = (FieldDescriptor) fields[i];
+ FieldDescriptor fld = fields[i];
criteria.addEqualTo(fld.getAttributeName(), values[i]);
}
@@ -2280,7 +2236,7 @@
pool = new ServerPool(config.getServers());
runningInServerMode = config.isRunningInServerMode();
-
+ System.out.println("Called configure");
// now build db if specified in config
autoCreateDb(pConfig);
@@ -2393,4 +2349,19 @@
return result;
}
}
+
+ /**
+ * clean up the maps for reuse by the next transaction.
+ */
+ private void clearRegistrationMaps()
+ {
+ if (m_markedForDelete != null)
+ {
+ m_markedForDelete.clear();
+ }
+ if (m_markedForStore != null)
+ {
+ m_markedForStore.clear();
+ }
+ }
}