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/10/08 14:07:33 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql SqlGeneratorDefaultImpl.java SqlPkStatement.java SqlSelectPkStatement.java SqlSelectStatement.java TableAliasHandler.java SqlCacheKey.java

arminw      2005/10/08 05:07:33

  Modified:    src/java/org/apache/ojb/broker/accesslayer/sql
                        SqlGeneratorDefaultImpl.java SqlPkStatement.java
                        SqlSelectPkStatement.java SqlSelectStatement.java
                        TableAliasHandler.java
  Removed:     src/java/org/apache/ojb/broker/accesslayer/sql
                        SqlCacheKey.java
  Log:
  use weak references for all metadata class instances to allow GC of freed/removed metadata instances
  
  Revision  Changes    Path
  1.37      +6 -4      db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlGeneratorDefaultImpl.java
  
  Index: SqlGeneratorDefaultImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlGeneratorDefaultImpl.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- SqlGeneratorDefaultImpl.java	7 Oct 2005 14:34:11 -0000	1.36
  +++ SqlGeneratorDefaultImpl.java	8 Oct 2005 12:07:33 -0000	1.37
  @@ -54,12 +54,14 @@
       TODO: In ClassDescriptor we need support for "field change event" listener if we allow
       to change metadata at runtime.
       Further on we have to deal with weak references to allow GC of outdated Metadata classes
  -    (key and value of map have to be weak references, because the SqlForClass indirectly
  -    refer the key in some cases).
  +    (key=cld of map have to be a weak reference and the metadata used in the SqlStatement classes too,
  +    because inner class SqlForClass indirectly refer the key=cld in some cases and SqlStatement
  +    implementation classes have references to metadata classes too).
  +    
       Field changes are not reflected in this implementation!
       */
       /** Cache for {@link SqlForClass} instances, keyed per class descriptor. */
  -    private Map sqlForClass = new ReferenceIdentityMap(ReferenceIdentityMap.WEAK, ReferenceIdentityMap.WEAK);
  +    private Map sqlForClass = new ReferenceIdentityMap(ReferenceIdentityMap.WEAK, ReferenceIdentityMap.HARD);
   
       public SqlGeneratorDefaultImpl(Platform platform)
       {
  
  
  
  1.8       +13 -4     db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlPkStatement.java
  
  Index: SqlPkStatement.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlPkStatement.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SqlPkStatement.java	22 Nov 2004 20:55:23 -0000	1.7
  +++ SqlPkStatement.java	8 Oct 2005 12:07:33 -0000	1.8
  @@ -15,6 +15,9 @@
    * limitations under the License.
    */
   
  +import java.lang.ref.WeakReference;
  +
  +import org.apache.ojb.broker.OJBRuntimeException;
   import org.apache.ojb.broker.PersistenceBrokerException;
   import org.apache.ojb.broker.metadata.ClassDescriptor;
   import org.apache.ojb.broker.metadata.FieldDescriptor;
  @@ -29,7 +32,8 @@
    */
   public abstract class SqlPkStatement extends AbstractSqlStatement
   {
  -    private ClassDescriptor m_classDescriptor;
  +    // arminw: Use weak reference to allow GC of removed metadata instances
  +    private WeakReference m_classDescriptor;
   
   	/**
   	 * Constructor for SqlPkStatement.
  @@ -38,7 +42,7 @@
   	public SqlPkStatement(Platform aPlatform,Logger aLogger, ClassDescriptor aCld)
   	{
   		super(aPlatform, aLogger);
  -        m_classDescriptor = aCld;
  +        m_classDescriptor = new WeakReference(aCld);
   	}
      	
       /**
  @@ -47,7 +51,12 @@
        */
       protected ClassDescriptor getClassDescriptor()
       {
  -        return m_classDescriptor;
  +        ClassDescriptor cld = (ClassDescriptor) m_classDescriptor.get();
  +        if(cld == null)
  +        {
  +            throw new OJBRuntimeException("Requested ClassDescriptor instance was already GC by JVM");
  +        }
  +        return cld;
       }
   
   	/**
  
  
  
  1.2       +7 -21     db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectPkStatement.java
  
  Index: SqlSelectPkStatement.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectPkStatement.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SqlSelectPkStatement.java	27 Apr 2005 19:21:52 -0000	1.1
  +++ SqlSelectPkStatement.java	8 Oct 2005 12:07:33 -0000	1.2
  @@ -17,6 +17,7 @@
   
   import org.apache.ojb.broker.metadata.ClassDescriptor;
   import org.apache.ojb.broker.metadata.FieldDescriptor;
  +import org.apache.ojb.broker.metadata.JdbcType;
   import org.apache.ojb.broker.platforms.Platform;
   import org.apache.ojb.broker.query.Query;
   import org.apache.ojb.broker.util.logging.Logger;
  @@ -30,39 +31,24 @@
    */
   public class SqlSelectPkStatement extends SqlSelectStatement
   {
  -    /**
  -     * @param aPlatform
  -     * @param aLogger
  -     * @param aCld
  -     * @param aQuery
  -     */
       public SqlSelectPkStatement(Platform aPlatform, Logger aLogger, ClassDescriptor aCld, Query aQuery)
       {
           super(aPlatform, aLogger, aCld, aQuery);
       }
   
  -    /**
  -     * @param parent
  -     * @param pf
  -     * @param cld
  -     * @param query
  -     * @param logger
  -     */
       public SqlSelectPkStatement(SqlQueryStatement parent, Platform pf, ClassDescriptor cld, Query query, Logger logger)
       {
           super(parent, pf, cld, query, logger);
       }
   
  -    /**
  -     * Return the Fields to be selected.
  -     *
  -     * @param cld the ClassDescriptor
  -     * @return
  -     */
  -    protected FieldDescriptor[] getFieldsForSelect(ClassDescriptor cld)
  +    protected FieldDescriptor[] buildFieldsForSelect(ClassDescriptor cld)
       {
           return cld.getPkFields();
       }
   
  +    public int getColumnIndex(FieldDescriptor fld)
  +    {
  +        return JdbcType.MIN_INT;
  +    }
   }
   
  
  
  
  1.45      +17 -35    db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java
  
  Index: SqlSelectStatement.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java,v
  retrieving revision 1.44
  retrieving revision 1.45
  diff -u -r1.44 -r1.45
  --- SqlSelectStatement.java	3 Oct 2005 17:35:24 -0000	1.44
  +++ SqlSelectStatement.java	8 Oct 2005 12:07:33 -0000	1.45
  @@ -20,6 +20,7 @@
   import java.util.List;
   import java.util.Map;
   import java.util.Set;
  +import java.lang.ref.WeakReference;
   
   import org.apache.commons.collections.set.ListOrderedSet;
   import org.apache.ojb.broker.accesslayer.sql.TableAliasHandler.TableAlias;
  @@ -43,7 +44,7 @@
    */
   public class SqlSelectStatement extends SqlQueryStatement implements SelectStatement
   {
  -    private FieldDescriptor[] fieldsForSelect;
  +    private WeakReference fieldsForSelect;
   
       /**
        * Constructor for SqlSelectStatement.
  @@ -81,9 +82,9 @@
        * @return list of column names for the set of all unique columns for multiple classes mapped to the
        * same table.
        */
  -    protected List appendListOfColumnsForSelect(ClassDescriptor cld, StringBuffer buf)
  +    protected List appendListOfColumnsForSelect(StringBuffer buf)
       {
  -        FieldDescriptor[] fieldDescriptors = getFieldsForSelect(cld);
  +        FieldDescriptor[] fieldDescriptors = getFieldsForSelect();
           ArrayList columnList = new ArrayList();
           TableAlias searchAlias = getSearchAlias();
   
  @@ -103,20 +104,12 @@
               columnList.add(field.getAttributeName());
           }
   
  -        appendClazzColumnForSelect(cld, buf);
  +        appendClazzColumnForSelect(buf);
           return columnList;
       }
   
       /**
        * Get MultiJoined ClassDescriptors
  -      */
  -    ClassDescriptor[] getMultiJoinedClassDescriptors()
  -    {
  -        return getMultiJoinedClassDescriptors(getSearchClassDescriptor());
  -    }
  -
  -    /**
  -     * Get MultiJoined ClassDescriptors
        * @param cld
        */
       private ClassDescriptor[] getMultiJoinedClassDescriptors(ClassDescriptor cld)
  @@ -136,11 +129,11 @@
       /**
        * Create the OJB_CLAZZ pseudo column based on CASE WHEN.
        * This column defines the Class to be instantiated.
  -     * @param cld
        * @param buf
        */
  -    private void appendClazzColumnForSelect(ClassDescriptor cld, StringBuffer buf)
  +    private void appendClazzColumnForSelect(StringBuffer buf)
       {
  +        ClassDescriptor cld = getSearchClassDescriptor();
           ClassDescriptor[] clds = getMultiJoinedClassDescriptors(cld);
   
           if (clds.length == 0)
  @@ -179,25 +172,13 @@
        *
        * @return the Fields to be selected
        */
  -    FieldDescriptor[] getFieldsForSelect()
  -    {
  -        return getFieldsForSelect(getSearchClassDescriptor());
  -    }
  -
  -    /**
  -     * Return the Fields to be selected.
  -     *
  -     * @param cld the ClassDescriptor
  -     * @return the Fields to be selected
  -     */
  -    protected FieldDescriptor[] getFieldsForSelect(ClassDescriptor cld)
  +    protected FieldDescriptor[] getFieldsForSelect()
       {
  -        if (fieldsForSelect == null)
  +        if (fieldsForSelect == null || fieldsForSelect.get() == null)
           {
  -            fieldsForSelect = buildFieldsForSelect(cld);
  +            fieldsForSelect = new WeakReference(buildFieldsForSelect(getSearchClassDescriptor()));
           }
  -
  -        return fieldsForSelect;
  +        return (FieldDescriptor[]) fieldsForSelect.get();
       }
   
       /**
  @@ -332,7 +313,7 @@
                    * will allow us to load objects with unique mapping fields that are mapped
                    * to the same table.
                    */                
  -                columnList.addAll(appendListOfColumnsForSelect(getSearchClassDescriptor(), stmt));
  +                columnList.addAll(appendListOfColumnsForSelect(stmt));
               }
               else
               {
  @@ -450,11 +431,12 @@
       public int getColumnIndex(FieldDescriptor fld)
       {
           int index = JdbcType.MIN_INT;
  -        if (fieldsForSelect != null)
  +        FieldDescriptor[] fields = getFieldsForSelect();
  +        if (fields != null)
           {
  -            for (int i = 0; i < fieldsForSelect.length; i++)
  +            for (int i = 0; i < fields.length; i++)
               {
  -                if (fieldsForSelect[i].equals(fld))
  +                if (fields[i].equals(fld))
                   {
                       index = i + 1;  // starts at 1
                       break;
  
  
  
  1.11      +29 -12    db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/TableAliasHandler.java
  
  Index: TableAliasHandler.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/TableAliasHandler.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- TableAliasHandler.java	18 Sep 2005 13:26:14 -0000	1.10
  +++ TableAliasHandler.java	8 Oct 2005 12:07:33 -0000	1.11
  @@ -15,12 +15,14 @@
    * limitations under the License.
    */
   
  +import java.lang.ref.WeakReference;
   import java.util.ArrayList;
   import java.util.HashMap;
   import java.util.Iterator;
   import java.util.List;
   import java.util.Map;
   
  +import org.apache.ojb.broker.OJBRuntimeException;
   import org.apache.ojb.broker.PersistenceBrokerException;
   import org.apache.ojb.broker.PersistenceBrokerSQLException;
   import org.apache.ojb.broker.metadata.ClassDescriptor;
  @@ -65,10 +67,15 @@
       private Logger m_logger;
       /** the parent handler or null*/
       private TableAliasHandler m_parentHandler;
  +    /*
  +    arminw:
  +    Use weak references for metadata class instances, because metadata instances
  +    can be freed/removed by user at runtime and should be GC
  +    */
       /** the descriptor of the base class, with respect to which all paths are done */
  -    private ClassDescriptor m_baseCld;
  +    private WeakReference m_baseCld;
       /** the descriptor of the search class, representing the extent to be searched */
  -    private ClassDescriptor m_searchCld;
  +    private WeakReference m_searchCld;
   
       private int m_aliasCount = 0;
   
  @@ -78,20 +85,20 @@
           m_logger = logger != null ? logger : LoggerFactory.getLogger(TableAliasHandler.class);
           m_query = aQuery;       
           m_parentHandler = parent;
  -        m_searchCld = searchCld;
  +        m_searchCld = new WeakReference(searchCld);
   
           if ((m_query == null) || (m_query.getBaseClass() == m_query.getSearchClass()))
           {
  -            m_baseCld = searchCld;
  +            m_baseCld = new WeakReference(searchCld);
           }
           else
           {
  -            m_baseCld = searchCld.getRepository().getDescriptorFor(m_query.getBaseClass());
  +            m_baseCld = new WeakReference(searchCld.getRepository().getDescriptorFor(m_query.getBaseClass()));
           }
   
  -        m_rootAlias = createTableAlias(m_baseCld, null, "");
  +        m_rootAlias = createTableAlias(getBaseClassDescriptor(), null, "");
   
  -        if (searchCld == m_baseCld)
  +        if (searchCld == getBaseClassDescriptor())
           {
               m_searchAlias = m_rootAlias;
           }
  @@ -101,9 +108,9 @@
           }
   
           // Walk the super reference-descriptor
  -        buildSuperJoinTree(m_rootAlias, m_baseCld, "", false);
  +        buildSuperJoinTree(m_rootAlias, getBaseClassDescriptor(), "", false);
   
  -        buildMultiJoinTree(m_rootAlias, m_baseCld, "", true);
  +        buildMultiJoinTree(m_rootAlias, getBaseClassDescriptor(), "", true);
   
           // In some cases it is necessary to split the query criteria
           // and then to generate UNION of several SELECTs
  @@ -144,12 +151,22 @@
   
       ClassDescriptor getBaseClassDescriptor()
       {
  -        return m_baseCld;
  +        ClassDescriptor cld = (ClassDescriptor) m_baseCld.get();
  +        if(cld == null)
  +        {
  +            throw new OJBRuntimeException("Requested ClassDescriptor instance was already GC by JVM");
  +        }
  +        return cld;
       }
   
       ClassDescriptor getSearchClassDescriptor()
       {
  -        return m_searchCld;
  +        ClassDescriptor cld = (ClassDescriptor) m_searchCld.get();
  +        if(cld == null)
  +        {
  +            throw new OJBRuntimeException("Requested ClassDescriptor instance was already GC by JVM");
  +        }
  +        return cld;
       }
       
       /**
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org