Re: Operation interrupted SQLException
Chanchal wrote:
I'm getting the following exception sporadically
java.sql.SQLException: Io exception: Operation interrupted
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:13=
4)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:17=
9)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:33=
3)
at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1099)
at
oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:
309) at DBManager.getQueue(DBManager.java:200)
This happens in the following code
[Code, including whichever line was 200, omitted]
I note in that code that the PreparedStatement and ResultSet are
closed twice. This is one reason I avoid the idiom wherein the
variables are initialized to 'null' and then again to the actual
reference. I prefer a variation on RAII ("Resource Acquisition is
Initialization"), which I shall also call "DIRTY" ("Dispose In
Resource Try-finallY"), which uses multiple try-finally blocks to
guarantee disposal of a resource declared 'final'. (Example at end of
post.)
John makes the very good point that if you don't give us much
information, we cannot give very much help. So, which line was line
200?
Any clue on what could be causing this exception would be of much help
John B. Matthews wrote:
Errors that occur "sporadically" always makes me think of incorrect
synchronization. I'm guessing the error occurs on line 200 of
DBManager.java. Does e.getNextException() have anything to add?
...
} catch(SQLException e) {
while (e != null) {
System.err.println ("Message: " + e.getMessage() + ""=
);
System.err.println ("SQLState: " + e.getSQLState () + =
"");
System.err.println ("ErrorCode: " + e.getErrorCode() + ""=
);
e = e.getNextException();
System.err.println();
}
}
The database might be closing the connection from its end, or the
calling code might be closing the connection concurrently with the
ResultSet action.
OP, read, study and follow the advice of
<http://sscce.org/>
DIRTY template:
public void doSomething()
{
final PreparedStatement pStmt;
try
{
pStmt = cxn.prepareStatement( query );
}
catch ( SQLException sqex )
{
final String msg = "Cannot create statement. SQLState = {"
+ sqex.getSQLState() +"}. "+ sqex.getLocalizedMessage();
IllegalStateException nex = new IllegalStateException( msg, sqex );
logger.error( msg, sqex );
throw nex;
}
assert pStmt != null;
try // all use of 'pStmt' is in this 'try' block
{
ResultSet rs = pStmt.executeQuery();
while ( rs.next() )
{ ... }
}
catch ( SQLException sqex )
{
final String msg = "Cannot handle query. SQLState = {"
+ sqex.getSQLState() +"}. "+ sqex.getLocalizedMessage();
IllegalStateException nex = new IllegalStateException( msg, sqex );
logger.error( msg, sqex );
throw nex;
}
finally
{
try
{
pStmt.close();
}
catch ( SQLException sqex )
{
final String msg = "Cannot close statement. SQLState = {"
+ sqex.getSQLState() +"}. "+ sqex.getLocalizedMessage();
IllegalStateException nex = new IllegalStateException( msg,
sqex );
logger.error( msg, sqex );
throw nex;
}
}
}
--
Lew