Class ConnectionHelper
- Direct Known Subclasses:
DerbyConnectionHelper,OracleConnectionHelper,PostgreSQLConnectionHelper
startBatch()
and endBatch(boolean) methods for this).
This class contains logic to retry execution of SQL statements. If this helper is not in batch mode
and if a statement fails due to an SQLException, then it is retried. If the block argument
of the constructor call was false then it is retried only once. Otherwise the statement is retried
until either it succeeds or the thread is interrupted. This clearly assumes that the only cause of
SQLExceptions is faulty Connections which are restored eventually.
Note:
This retry logic only applies to the following methods:
This class is not thread-safe and if it is to be used by multiple threads then the clients must make sure that access to this class is properly synchronized.
Implementation note: The Connection that is retrieved from the DataSource
in getConnection(boolean) may be broken. This is so because if an internal DataSource is used,
then this is a commons-dbcp DataSource with a testWhileIdle validation strategy (see
the ConnectionFactory class). Furthermore, if it is a DataSource obtained through JNDI then we
can make no assumptions about the validation strategy. This means that our retry logic must either assume that
the SQL it tries to execute can do so without errors (i.e., the statement is valid), or it must implement its
own validation strategy to apply. Currently, the former is in place.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionclassThis class encapsulates the logic to retry a method invocation if it threw an SQLException. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionfinal voidendBatch(boolean commit) This method always ends the batch mode.final voidExecutes a general SQL statement and immediately closes all resources.final ResultSetExecutes a general SQL statement and returns theResultSetof the executed statement.final StringprepareDbIdentifier(String identifier) A utility method that makes sure thatidentifierdoes only consist of characters that are allowed in names on the target database.final ResultSetExecutes a SQL query and returns theResultSet.final voidStarts the batch mode.final booleantableExists(String tableName) Checks whether the given table exists in the database.final intExecutes an update or delete statement and returns the update count.
-
Constructor Details
-
ConnectionHelper
- Parameters:
dataSrc- theDataSourceon which this instance actsblock- whether the helper should transparently block on DB connection loss (otherwise it retries once and if that fails throws exception)
-
-
Method Details
-
prepareDbIdentifier
A utility method that makes sure thatidentifierdoes only consist of characters that are allowed in names on the target database. Illegal characters will be escaped as necessary. This method is not affected by the- Parameters:
identifier- the identifier to convert to a db specific identifier- Returns:
- the db-normalized form of the given identifier
- Throws:
SQLException- if an error occurs
-
tableExists
Checks whether the given table exists in the database.- Parameters:
tableName- the name of the table- Returns:
- whether the given table exists
- Throws:
SQLException- on error
-
startBatch
Starts the batch mode. If anSQLExceptionis thrown, then the batch mode is not started.Important: clients that call this method must make sure that
endBatch(boolean)is called eventually.- Throws:
SQLException- on error
-
endBatch
This method always ends the batch mode.- Parameters:
commit- whether the changes in the batch should be committed or rolled back- Throws:
SQLException- if the commit or rollback of the underlying JDBC Connection threw anSQLException
-
exec
Executes a general SQL statement and immediately closes all resources. Note: We use a Statement if there are no parameters to avoid a problem on the Oracle 10g JDBC driver w.r.t. :NEW and :OLD keywords that triggers ORA-17041.- Parameters:
sql- an SQL statement stringparams- the parameters for the SQL statement- Throws:
SQLException- on error
-
update
Executes an update or delete statement and returns the update count.- Parameters:
sql- an SQL statement stringparams- the parameters for the SQL statement- Returns:
- the update count
- Throws:
SQLException- on error
-
query
- Parameters:
sql- an SQL statement stringparams- the parameters for the SQL statement- Returns:
- a
ResultSet - Throws:
SQLException
-
exec
public final ResultSet exec(String sql, Object[] params, boolean returnGeneratedKeys, int maxRows) throws SQLException Executes a general SQL statement and returns theResultSetof the executed statement. The returnedResultSetshould be closed by clients.- Parameters:
sql- an SQL statement stringparams- the parameters for the SQL statementreturnGeneratedKeys- whether generated keys should be returnedmaxRows- the maximum number of rows in a potentialResultSet(0 means no limit)- Returns:
- a
ResultSet - Throws:
SQLException- on error
-