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();
  +		}
  +	}
   }