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]