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

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

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

  在Java程序中休眠一段时间(10到20秒),

  当我们的Java 程序休眠时,我们在一个单独的SQL*Plus会话中重新编译包pkg的包体,

  在Java程序中使用JDBC重新执行pkg.p 存储过程——这将导致ORA-04068错误。

  叫做ExecutePackageProcedureTwice 的Java程序显示如下。它执行了pkg.p存储过程,休眠了20秒以给我们充足的时间来重新编译这个包以模拟部署,然后重新执行这个存储过程:

  packagedbj2ee.article2.design1;
  importjava.sql.CallableStatement;
  importjava.sql.Connection;
  importjava.sql.DriverManager;
  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);
  }finally{
  try{
  if(cstmt!=null)
  cstmt.close();
  if(conn!=null)
  conn.close();
  }catch(Exceptione){
  e.printStackTrace();
  }
  }
  }
  privatestaticConnectiongetConnection()throwsException{
  DriverManager.registerDriver(newOracleDriver());
  returnDriverManager.getConnection("jdbc:oracle:thin:@hercdev:1521:hercdev","hercules","hercules");
  }
  privatestaticvoidexecutePkg(Connectionconn,CallableStatementcstmt)throwsException{
  System.out.println("Executingthepackage...");
  cstmt.executeUpdate();
  conn.commit();
  }
  }

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

正在加载评论...