arminw      2005/11/05 08:17:27

  Modified:    src/java/org/apache/ojb/broker/accesslayer Tag:
                        OJB_1_0_RELEASE JdbcAccessImpl.java
  Log:
  fix potential resource leaks
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.22.2.10 +27 -61    
db-ojb/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
  
  Index: JdbcAccessImpl.java
  ===================================================================
  RCS file: 
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java,v
  retrieving revision 1.22.2.9
  retrieving revision 1.22.2.10
  diff -u -r1.22.2.9 -r1.22.2.10
  --- JdbcAccessImpl.java       22 Oct 2005 12:21:40 -0000      1.22.2.9
  +++ JdbcAccessImpl.java       5 Nov 2005 16:17:27 -0000       1.22.2.10
  @@ -260,17 +260,15 @@
               scrollable = true;
           }
           final StatementManagerIF sm = broker.serviceStatementManager();
  -        ResultSetAndStatement retval = null;
           final SelectStatement sql = 
broker.serviceSqlGenerator().getPreparedSelectStatement(query, cld);
  +        PreparedStatement stmt = null;
  +        ResultSet rs = null;
           try
           {
               final int queryFetchSize = query.getFetchSize();
               final boolean isStoredProcedure = 
isStoredProcedure(sql.getStatement());
  -            final PreparedStatement stmt;
               stmt = sm.getPreparedStatement(cld, sql.getStatement() ,
                       scrollable, queryFetchSize, isStoredProcedure);
  -
  -            ResultSet rs;
               if (isStoredProcedure)
               {
                   // Query implemented as a stored procedure, which must 
return a result set.
  @@ -294,36 +292,19 @@
                   rs = stmt.executeQuery();
               }
   
  -            retval = new ResultSetAndStatement(sm, stmt, rs, sql);
  -            return retval;
  +            return new ResultSetAndStatement(sm, stmt, rs, sql);
           }
           catch (PersistenceBrokerException e)
           {
  +            // release resources on exception
  +            sm.closeResources(stmt, rs);
               logger.error("PersistenceBrokerException during the execution of 
the query: " + e.getMessage(), e);
  -            /*
  -                      * MBAIRD: error condition could result in our
  -                      * ResultSetAndStatement not being returned, and not 
being closed
  -                      * since it is opened before the try loop, we should 
release it if
  -                      * there is a problem.
  -                      */
  -            if (retval != null)
  -            {
  -                retval.close();
  -            }
               throw e;
           }
           catch (SQLException e)
           {
  -            /*
  -                      * MBAIRD: error condition could result in our
  -                      * ResultSetAndStatement not being returned, and not 
being closed
  -                      * since it is opened before the try loop, we should 
release it if
  -                      * there is a problem.
  -                      */
  -            if (retval != null)
  -            {
  -                retval.close();
  -            }
  +            // release resources on exception
  +            sm.closeResources(stmt, rs);
               throw ExceptionHelper.generateException(e, sql.getStatement(), 
null, logger, null);
           }
       }
  @@ -352,13 +333,12 @@
           if (logger.isDebugEnabled()) logger.debug("executeSQL: " + sql);
           final boolean isStoredprocedure = isStoredProcedure(sql);
           final StatementManagerIF sm = broker.serviceStatementManager();
  -        ResultSetAndStatement retval = null;
  +        PreparedStatement stmt = null;
  +        ResultSet rs = null;
           try
           {
  -            final PreparedStatement stmt = sm.getPreparedStatement(cld, sql,
  +            stmt = sm.getPreparedStatement(cld, sql,
                       scrollable, 
StatementManagerIF.FETCH_SIZE_NOT_EXPLICITLY_SET, isStoredprocedure);
  -
  -            ResultSet rs;
               if (isStoredprocedure)
               {
                   // Query implemented as a stored procedure, which must 
return a result set.
  @@ -376,7 +356,7 @@
   
               // as we return the resultset for further operations, we cannot 
release the statement yet.
               // that has to be done by the JdbcAccess-clients (i.e. 
RsIterator, ProxyRsIterator and PkEnumeration.)
  -            retval = new ResultSetAndStatement(sm, stmt, rs, new 
SelectStatement()
  +            return new ResultSetAndStatement(sm, stmt, rs, new 
SelectStatement()
               {
                   public Query getQueryInstance()
                   {
  @@ -393,32 +373,18 @@
                       return sql;
                   }
               });
  -            return retval;
           }
           catch (PersistenceBrokerException e)
           {
  +            // release resources on exception
  +            sm.closeResources(stmt, rs);
               logger.error("PersistenceBrokerException during the execution of 
the SQL query: " + e.getMessage(), e);
  -
  -            /**
  -             * MBAIRD: error condition could result in our 
ResultSetAndStatement not being returned, and not being closed
  -             * since it is opened before the try loop, we should release it 
if there is a problem.
  -             */
  -            if (retval != null)
  -            {
  -                retval.close();
  -            }
               throw e;
           }
           catch (SQLException e)
           {
  -            /**
  -             * MBAIRD: error condition could result in our 
ResultSetAndStatement not being returned, and not being closed
  -             * since it is opened before the try loop, we should release it 
if there is a problem.
  -             */
  -            if (retval != null)
  -            {
  -                retval.close();
  -            }
  +            // release resources on exception
  +            sm.closeResources(stmt, rs);
               throw ExceptionHelper.generateException(e, sql, cld, values, 
logger, null);
           }
       }
  @@ -587,11 +553,12 @@
       {
           final StatementManagerIF sm = broker.serviceStatementManager();
           final SelectStatement sql = 
broker.serviceSqlGenerator().getPreparedSelectByPkStatement(cld);
  -        ResultSetAndStatement rs_stmt = null;
           Object result = null;
  +        PreparedStatement stmt = null;
  +        ResultSet rs = null;
           try
           {
  -            PreparedStatement stmt = sm.getSelectByPKStatement(cld);
  +            stmt = sm.getSelectByPKStatement(cld);
               if (stmt == null)
               {
                   logger.error("getSelectByPKStatement returned a null 
statement");
  @@ -602,32 +569,31 @@
               thus we can always set 'false'. Is this correct??
               */
               sm.bindSelect(stmt, oid, cld, false);
  -            ResultSet rs = stmt.executeQuery();
  -            // let OJB handle the resources
  -            rs_stmt = new ResultSetAndStatement(sm, stmt, rs, sql);
  -
  +            rs = stmt.executeQuery();
               // data available read object, else return null
  +            ResultSetAndStatement rs_stmt = new 
ResultSetAndStatement(broker.serviceStatementManager(), stmt, rs, sql);
               if (rs.next())
               {
                   Map row = new HashMap();
                   cld.getRowReader().readObjectArrayFrom(rs_stmt, row);
                   result = cld.getRowReader().readObjectFrom(row);
               }
  +            // close resources
  +            rs_stmt.close();
           }
           catch (PersistenceBrokerException e)
           {
  +            // release resources on exception
  +            sm.closeResources(stmt, rs);
               logger.error("PersistenceBrokerException during the execution of 
materializeObject: " + e.getMessage(), e);
               throw e;
           }
           catch (SQLException e)
           {
  +            // release resources on exception
  +            sm.closeResources(stmt, rs);
               throw ExceptionHelper.generateException(e, sql.getStatement(), 
cld, logger, null);
           }
  -        finally
  -        {
  -            // close all resources
  -            if(rs_stmt != null) rs_stmt.close();
  -        }
           return result;
       }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to