关于JDBC的资源释放问题
高手们,请看下面的代码, 请问资源释放是否正确,但为什么数据库中,总有没
释放的cursor呢。(我用的是ORACLE数据库)
ArrayList alTaskExecList;
PreparedStatement psExecInfoStmt;
……
……
public synchronized int writeTaskExecInfo(){
if(alTaskExecList.isEmpty()==true){
return -1;
}
String sCmdLine="";
String sSql="";
TaskExecInfo mTaskExecRec = new TaskExecInfo();
try{
int iCount = alTaskExecList.size();
int i;
for(i=0;i<iCount;iCount--){
mTaskExecRec = (TaskExecInfo)alTaskExecList.get(i);
sSql="INSERT INTO tad_taskexecinfo"+
" (task_id,cmdline,status,start_time) VALUE
("+mTaskExecRec.iTaskId+",?,"+mTaskExecRec.iStatus+
",'"+mTaskExecRec.sStartTime+"')";
psExecInfoStmt = mCon.prepareStatement(sSql);
psExecInfoStmt.setString(1,sCmdLine);
log.write("=====psExecInfoStmt.setString ? = "+sCmdLine+"\n");
psExecInfoStmt.executeUpdate();
alTaskExecList.remove(i);//从列表中删除成功的语句
log.write("DBProxy::writeTaskExecInfo insert sql:"+sSql+" success\n");
log.write("cmdline:"+sCmdLine+"\n");
}
}catch(Exception e){
log.write("DBProxy::writeTaskExecInfo failed,Sql:"+sSql+e+"\n");
log.write("cmdline:"+sCmdLine+"\n");
e.printStackTrace();
return -1;
}
finally
{
Scheduler.log.write("========== in finally =========="+"\n");
if( psExecInfoStmt != null )
try{
psExecInfoStmt.close();
log.write("==== close"+"\n");
}catch(SQLException se)
{}
}
return 0;
}
运行较长一段时间后,会出现异常:
java.sql.SQLException: ORA-01000: maximum open cursors exceeded
ORA-06512: at "NMOSDB.TR_TAD_TASKEXECINFO_SERIAL_I", line 4
ORA-04088: error during execution of trigger 'NMOSDB.TR_TAD_TASKEXECINFO_SERIAL_I'
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:579)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1894)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1094)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2132)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2015)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2877)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
at DBProxy.writeTaskExecInfo(DBProxy.java:344)
at DBProxy.run(DBProxy.java:59)
at java.lang.Thread.run(Thread.java:536)
在数据库中,用select * from v$OPEN_CURSOR; 察看确实有许多没有释放的cursor.