在Java/JDBC中透明处理“ORA-04068”错误

http://tech.ddvip.com   2008年05月08日    社区交流

内容摘要:在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。

  现在,正如我们所说的,我们知道在客户端级别(在这个例子中是在Java程序中)通过丢出的异常我们可以监测错误的代码并通过重新执行这个包来作出响应。最简单的执行如修改过的程序dbj2ee.article2.design2.ExecutePackageProcedureTwice 所显示——与第一个版本的不同之处用粗体显示,便于你查看。正如你所看到的,我们捕捉SQLException 并查看这个错误是否是ORA-04068——如果是,那我们重新执行这个包,否则我们再次抛出这个错误。

  packagedbj2ee.article2.design2;
  importjava.sql.CallableStatement;
  importjava.sql.Connection;
  importjava.sql.DriverManager;
  importjava.sql.SQLException;
  importoracle.jdbc.OracleDriver;
  publicclassExecutePackageProcedureTwice{
  publicstaticvoidmain(String[]args)throwsException{
  Connectionconn=null;
  CallableStatementcstmt=null;
  longsleepInSecs=20;
  try{
  conn=getConnection();
  cstmt=conn.prepareCall("{callpkg.p()}");
  executePkg(conn,cstmt);
  System.out.println("Sleepingfor"+sleepInSecs+"seconds...");
  Thread.sleep(sleepInSecs*1000);
  System.out.println("Outofsleep...");
  executePkg(conn,cstmt);
  }catch(SQLExceptione){
  if(reExecutionRequired(e)){
  System.out.println("ORA-04068detected-re-executingthepackage...");
  executePkg(conn,cstmt);
  }else
  throwe;
  }finally{
  try{
  if(cstmt!=null)
  cstmt.close();
  if(conn!=null)
  conn.close();
  }catch(Exceptione){
  e.printStackTrace();
  }
  }
  }
  privatestaticbooleanreExecutionRequired(SQLExceptione){
  return"72000".equals(e.getSQLState())&&e.getErrorCode()==4068;
  }
  privatestaticConnectiongetConnection()throwsException{
  DriverManager.registerDriver(newOracleDriver());
  returnDriverManager.getConnection(
  "jdbc:oracle:thin:@devhost:1521:ora92","rmenon","rmenon");
  }
  privatestaticvoidexecutePkg(Connectionconn,CallableStatementcstmt)
  throwsException{
  System.out.println("Executingthepackage...");
  cstmt.executeUpdate();
  conn.commit();
  }
  }

来源:IT专家网    作者:戴羽    责编:豆豆技术应用

正在加载评论...