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/02 04:35:25 UTC
cvs commit: jakarta-ojb/src/java/org/apache/ojb/broker/accesslayer JdbcAccess.java JdbcAccessImpl.java
mattbaird 2003/02/01 19:35:24
Modified: src/java/org/apache/ojb/broker/accesslayer JdbcAccess.java
JdbcAccessImpl.java
Log:
fix some potential leaks, and add scrollable parameter. Using scrollable cursors is a burden on performance, so we'll want to have these scrollable parameters bubble all the way up to the client.
Revision Changes Path
1.30 +5 -3 jakarta-ojb/src/java/org/apache/ojb/broker/accesslayer/JdbcAccess.java
Index: JdbcAccess.java
===================================================================
RCS file: /home/cvs//jakarta-ojb/src/java/org/apache/ojb/broker/accesslayer/JdbcAccess.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- JdbcAccess.java 19 Jan 2003 17:20:16 -0000 1.29
+++ JdbcAccess.java 2 Feb 2003 03:35:24 -0000 1.30
@@ -96,16 +96,18 @@
* performs a SQL SELECT statement against RDBMS.
* @param sqlStatement the query string.
* @param cld ClassDescriptor providing meta-information.
+ * @param scrollable Does this resultset need cursor control for operations like last, first and size
*/
- public ResultSetAndStatement executeSQL(String sqlStatement, ClassDescriptor cld) throws PersistenceBrokerException;
+ public ResultSetAndStatement executeSQL(String sqlStatement, ClassDescriptor cld, boolean scrollable) throws PersistenceBrokerException;
/**
* performs a SQL SELECT statement against RDBMS.
* @param sqlStatement the query string.
* @param cld ClassDescriptor providing meta-information.
* @param values The set of values to bind to the statement (may be null)
+ * @param scrollable Does this resultset need cursor control for operations like last, first and size
*/
- public ResultSetAndStatement executeSQL(String sqlStatement, ClassDescriptor cld, Object[] values) throws PersistenceBrokerException;
+ public ResultSetAndStatement executeSQL(String sqlStatement, ClassDescriptor cld, Object[] values, boolean scrollable) throws PersistenceBrokerException;
/**
* performs a SQL UPDTE, INSERT or DELETE statement against RDBMS.
1.5 +46 -363 jakarta-ojb/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java
Index: JdbcAccessImpl.java
===================================================================
RCS file: /home/cvs//jakarta-ojb/src/java/org/apache/ojb/broker/accesslayer/JdbcAccessImpl.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- JdbcAccessImpl.java 31 Jan 2003 16:57:35 -0000 1.4
+++ JdbcAccessImpl.java 2 Feb 2003 03:35:24 -0000 1.5
@@ -233,7 +233,7 @@
{
if(logger.isDebugEnabled()) logger.safeDebug("executeQuery", query);
- ResultSetAndStatement retval = new ResultSetAndStatement();
+ ResultSetAndStatement retval = new ResultSetAndStatement(broker.serviceConnectionManager().getSupportedPlatform());
/**
* MBAIRD:
* we should create a scrollable resultset if the start at index or end at index is set
@@ -278,19 +278,35 @@
catch (PersistenceBrokerException e)
{
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)
{
logger.error("SQLException during the execution of the query (for a " + cld.getClassOfObject().getName() + "): " + 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 new PersistenceBrokerSQLException(e);
}
-
}
- public ResultSetAndStatement executeSQL(String sqlStatement, ClassDescriptor cld) throws PersistenceBrokerException
+ public ResultSetAndStatement executeSQL(String sqlStatement, ClassDescriptor cld, boolean scrollable)
+ throws PersistenceBrokerException
{
- return executeSQL(sqlStatement, cld, null);
+ return executeSQL(sqlStatement, cld, null, scrollable);
}
/**
@@ -298,15 +314,16 @@
* @param sqlStatement the query string.
* @param cld ClassDescriptor providing meta-information.
*/
- public ResultSetAndStatement executeSQL(String sqlStatement, ClassDescriptor cld, Object[] values) throws PersistenceBrokerException
+ public ResultSetAndStatement executeSQL(String sqlStatement, ClassDescriptor cld, Object[] values, boolean scrollable)
+ throws PersistenceBrokerException
{
if (logger.isDebugEnabled()) logger.debug("executeSQL: " + sqlStatement);
- ResultSetAndStatement retval = new ResultSetAndStatement();
+ ResultSetAndStatement retval = new ResultSetAndStatement(broker.serviceConnectionManager().getSupportedPlatform());
StatementManagerIF stmtMan = broker.serviceStatementManager();
try
{
- PreparedStatement stmt = stmtMan.getPreparedStatement(cld, sqlStatement, Query.SCROLLABLE);
+ PreparedStatement stmt = stmtMan.getPreparedStatement(cld, sqlStatement, scrollable);
stmtMan.bindValues(stmt, values, 1);
ResultSet rs = stmt.executeQuery();
// as we return the resultset for further operations, we cannot release the statement yet.
@@ -318,11 +335,28 @@
catch (PersistenceBrokerException e)
{
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)
{
logger.error("SQLException 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 new PersistenceBrokerSQLException(e);
}
}
@@ -366,7 +400,10 @@
{
throw new KeyConstraintViolatedException(e);
}
- throw new PersistenceBrokerSQLException(e);
+ else
+ {
+ throw new PersistenceBrokerSQLException(e);
+ }
}
finally
{
@@ -482,358 +519,4 @@
broker.serviceStatementManager().closeResources(stmt, rs);
}
}
-
-// /**
-// * retrieves an Object from a ResultSet column.
-// * @param rs the ResultSet to be read from.
-// * @param fld The FIELDDESCRIPTOR containing metainfo on the column:
-// * it contins info on the expected JDBC Type and the name of the column.
-// * @return Object the read in object.
-// */
-// static Object getObjectFromColumn(ResultSet rs, FieldDescriptor fld) throws SQLException
-// {
-// return getObjectFromColumn(rs, fld.getColumnJdbcType(), fld.getColumnName());
-// }
-//
-// static Object getObjectFromColumn(ResultSet rs, int jdbcType, String columnId) throws SQLException
-// {
-// Object result = null;
-// /**
-// * we use these to avoid building an object for a null result column
-// */
-// long longVal;
-// int intVal;
-// boolean boolVal;
-// double doubleVal;
-// float floatVal;
-// short shortVal;
-// byte byteVal;
-//
-// switch (jdbcType)
-// {
-// case Types.BIT :
-// {
-// boolVal = rs.getBoolean( columnId );
-// result = ( rs.wasNull() ? null : new Boolean( boolVal ) );
-// break;
-// }
-// case Types.TINYINT :
-// {
-// byteVal = rs.getByte( columnId );
-// result = ( rs.wasNull() ? null : new Byte( byteVal ) );
-// break;
-// }
-// case Types.SMALLINT :
-// {
-// shortVal = rs.getShort( columnId );
-// result = ( rs.wasNull() ? null : new Short( shortVal ) );
-// break;
-// }
-// case Types.INTEGER :
-// {
-// intVal = rs.getInt( columnId );
-// result = ( rs.wasNull() ? null : new Integer( intVal ) );
-// break;
-// }
-// case Types.BIGINT :
-// {
-// longVal = rs.getLong( columnId );
-// result = ( rs.wasNull() ? null : new Long( longVal ) );
-// break;
-// }
-// case Types.DOUBLE :
-// case Types.FLOAT :
-// {
-// doubleVal = rs.getDouble( columnId );
-// result = ( rs.wasNull() ? null : new Double( doubleVal ) );
-// break;
-// }
-// case Types.REAL :
-// {
-// floatVal = rs.getFloat( columnId );
-// result = ( rs.wasNull() ? null : new Float( floatVal ) );
-// break;
-// }
-// case Types.NUMERIC :
-// {
-// result = rs.getBigDecimal(columnId);
-// break;
-// }
-// case Types.DECIMAL :
-// {
-// result = rs.getBigDecimal(columnId);
-// break;
-// }
-//
-// case Types.CHAR :
-// {
-// result = rs.getString(columnId);
-// break;
-// }
-// case Types.VARCHAR :
-// {
-// result = rs.getString(columnId);
-// break;
-// }
-// case Types.LONGVARCHAR :
-// {
-// result = rs.getString(columnId);
-// break;
-// }
-//
-// case Types.DATE :
-// {
-// result = rs.getDate(columnId);
-// break;
-// }
-// case Types.TIME :
-// {
-// result = rs.getTime(columnId);
-// break;
-// }
-// case Types.TIMESTAMP :
-// {
-// result = rs.getTimestamp(columnId);
-// break;
-// }
-//
-// case Types.BINARY :
-// {
-// result = rs.getBytes(columnId);
-// break;
-// }
-// case Types.VARBINARY :
-// {
-// result = rs.getBytes(columnId);
-// break;
-// }
-// case Types.LONGVARBINARY :
-// {
-// result = rs.getBytes(columnId);
-// break;
-// }
-// case Types.CLOB :
-// {
-// java.sql.Clob aClob = rs.getClob(columnId);
-// result = ( rs.wasNull() ? null : aClob.getSubString(1L, (int) aClob.length()) );
-// break;
-// }
-// case Types.BLOB :
-// {
-// java.sql.Blob aBlob = rs.getBlob(columnId);
-// result = ( rs.wasNull() ? null : aBlob.getBytes(1L, (int) aBlob.length()) );
-// break;
-// }
-// default :
-// {
-// throw new OJBRuntimeException(
-// "The type "
-// + jdbcType
-// + " for attribute "
-// + columnId
-// + " can not be handled by OJB. Please specify only types as defined by java.sql.Types.");
-// }
-// }
-// return result;
-// }
-//
-// static Object getObjectFromColumn(ResultSet rs, int jdbcType, int columnId) throws SQLException
-// {
-// Object result = null;
-// /**
-// * we use these to avoid building an object for a null result column
-// */
-// long longVal;
-// int intVal;
-// boolean boolVal;
-// double doubleVal;
-// float floatVal;
-// short shortVal;
-// byte byteVal;
-//
-// switch (jdbcType)
-// {
-// case Types.BIT :
-// {
-// boolVal = rs.getBoolean( columnId );
-// result = ( rs.wasNull() ? null : new Boolean( boolVal ) );
-// break;
-// }
-// case Types.TINYINT :
-// {
-// byteVal = rs.getByte( columnId );
-// result = ( rs.wasNull() ? null : new Byte( byteVal ) );
-// break;
-// }
-// case Types.SMALLINT :
-// {
-// shortVal = rs.getShort( columnId );
-// result = ( rs.wasNull() ? null : new Short( shortVal ) );
-// break;
-// }
-// case Types.INTEGER :
-// {
-// intVal = rs.getInt( columnId );
-// result = ( rs.wasNull() ? null : new Integer( intVal ) );
-// break;
-// }
-// case Types.BIGINT :
-// {
-// longVal = rs.getLong( columnId );
-// result = ( rs.wasNull() ? null : new Long( longVal ) );
-// break;
-// }
-// case Types.DOUBLE :
-// case Types.FLOAT :
-// {
-// doubleVal = rs.getDouble( columnId );
-// result = ( rs.wasNull() ? null : new Double( doubleVal ) );
-// break;
-// }
-// case Types.REAL :
-// {
-// floatVal = rs.getFloat( columnId );
-// result = ( rs.wasNull() ? null : new Float( floatVal ) );
-// break;
-// }
-// case Types.NUMERIC :
-// {
-// result = rs.getBigDecimal(columnId);
-// break;
-// }
-// case Types.DECIMAL :
-// {
-// result = rs.getBigDecimal(columnId);
-// break;
-// }
-//
-// case Types.CHAR :
-// {
-// result = rs.getString(columnId);
-// break;
-// }
-// case Types.VARCHAR :
-// {
-// result = rs.getString(columnId);
-// break;
-// }
-// case Types.LONGVARCHAR :
-// {
-// result = rs.getString(columnId);
-// break;
-// }
-//
-// case Types.DATE :
-// {
-// result = rs.getDate(columnId);
-// break;
-// }
-// case Types.TIME :
-// {
-// result = rs.getTime(columnId);
-// break;
-// }
-// case Types.TIMESTAMP :
-// {
-// result = rs.getTimestamp(columnId);
-// break;
-// }
-//
-// case Types.BINARY :
-// {
-// result = rs.getBytes(columnId);
-// break;
-// }
-// case Types.VARBINARY :
-// {
-// result = rs.getBytes(columnId);
-// break;
-// }
-// case Types.LONGVARBINARY :
-// {
-// result = rs.getBytes(columnId);
-// break;
-// }
-// case Types.CLOB :
-// {
-// java.sql.Clob aClob = rs.getClob(columnId);
-// result = ( rs.wasNull() ? null : aClob.getSubString(1L, (int) aClob.length()) );
-// break;
-// }
-// case Types.BLOB :
-// {
-// java.sql.Blob aBlob = rs.getBlob(columnId);
-// result = ( rs.wasNull() ? null : aBlob.getBytes(1L, (int) aBlob.length()) );
-// break;
-// }
-// default :
-// {
-// throw new OJBRuntimeException(
-// "The type "
-// + jdbcType
-// + " for attribute "
-// + columnId
-// + " can not be handled by OJB. Please specify only types as defined by java.sql.Types.");
-// }
-// }
-// return result;
-// }
-// /**
-// * determines the JDBC type (represented as an int value as specified
-// * by java.sql.Types) of a FIELDDESCRIPTOR idetified by index.
-// * @param cld The ClassDescriptor containing the FIELDDESCRIPTOR.
-// * @param index index identifies the FIELDDESCRIPTOR within cld.
-// * @return the int value representing the Type according to
-// * java.sql.Types
-// */
-// static int getSqlTypeAll(ClassDescriptor cld, int index)
-// {
-// FieldDescriptor fld = cld.getFieldDescriptions()[index];
-// return fld.getColumnJdbcType();
-// }
-//
-// /**
-// * determines the JDBC type (represented as an int value as specified
-// * by java.sql.Types) of a FIELDDESCRIPTOR idetified by index.
-// * @param cld The ClassDescriptor containing the FIELDDESCRIPTOR.
-// * @param index index identifies the FIELDDESCRIPTOR within the
-// * Non-PrimaryKey-fields of cld.
-// * @return the int value representing the Type according to
-// * java.sql.Types
-// */
-// static int getSqlTypeNonPk(ClassDescriptor cld, int index)
-// {
-// FieldDescriptor fld = cld.getNonPkFields()[index];
-// return fld.getColumnJdbcType();
-// }
-//
-// /**
-// * determines the JDBC type (represented as an int value as specified
-// * by java.sql.Types) of a FIELDDESCRIPTOR idetified by index.
-// * @param cld The ClassDescriptor containing the FIELDDESCRIPTOR.
-// * @param index index identifies the FIELDDESCRIPTOR within the
-// * PrimaryKey-fields of cld.
-// * @return the int value representing the Type according to
-// * java.sql.Types
-// */
-// static int getSqlTypePk(ClassDescriptor cld, int index)
-// {
-// FieldDescriptor fld = cld.getPkFields()[index];
-// return fld.getColumnJdbcType();
-// }
-//
-// /**
-// * determines the JDBC type (represented as an int value as specified
-// * by java.sql.Types) of a FIELDDESCRIPTOR idetified by index.
-// * @param cld The ClassDescriptor containing the FIELDDESCRIPTOR.
-// * @param index index identifies the FIELDDESCRIPTOR within the
-// * PrimaryKey-fields of cld.
-// * @return the int value representing the Type according to
-// * java.sql.Types
-// */
-// static int getSqlTypeLocking(ClassDescriptor cld, int index)
-// {
-// FieldDescriptor fld = cld.getLockingFields()[index];
-// return fld.getColumnJdbcType();
-// }
}