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

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

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

  我们下一个潜在的解决方法精简了这一节中展示的解决方法,使得包的重新执行对于一个已有的系统是透明的,因此使得它在这个系统中的执行是切实可行的。

  解决方法4:透明地监测ORA-0408错误并重新执行包的存储过程

  这个解决方法的思想是:

  我们用我们自己的封装类,叫做MyConnectionWrapper,来替代Oracle的连接执行。做这个替代的最好地方是在驱动级别——通过编写一个封装驱动——尽管你可以在连接池执行级别做这个替代(例如在数据源中)。

  我们的连接封装会返回一个叫做CallableStatement的CallableStatement封装,而不是无论何时我们调用它之上的方法prepareCall()就执行Oracle的CallableStatement。在其它所有的方法中,这个封装类会用这个动作代替封装的连接,因此它的行为和一个普通连接对象方式一样。

  我们的CallableStatement 封装会在调用它上面的“execute”方法时捕捉异常——如果它监测到ORA-04068错误,它会透明地对这个封装的CallableStatement对象重新执行这个方法。在其它所有的方法中,它会简单地以封装的CallableStatement 对象来代表它。

  首先我们将执行我们自己的驱动,这个驱动执行java.sql.Driver接口并封装Oracle驱动类。MyDriverWrapper类显示如下:

  packagedbj2ee.article2.design3;
  importjava.sql.Connection;
  importjava.sql.Driver;
  importjava.sql.DriverManager;
  importjava.sql.DriverPropertyInfo;
  importjava.sql.SQLException;
  importjava.util.Properties;
  importoracle.jdbc.OracleDriver;
  publicfinalclassMyDriverWrapperimplementsDriver{
  privatestaticfinalDriverPropertyInfo[]DRIVER_PROPERTY_INFO=
  newDriverPropertyInfo[0];
  publicstaticfinalStringACCEPTABLE_URL_PREFIX="jdbc:dbj2ee:orawrapper:";
  privatestaticDriverdriver=newOracleDriver();
  static{
  try{
  DriverManager.registerDriver(newMyDriverWrapper());
  }catch(Exceptione){
  e.printStackTrace();
  }
  }
  publicConnectionconnect(Stringurl,Propertiesinfo)throwsSQLException{
  StringmyUrl=url.replaceFirst(ACCEPTABLE_URL_PREFIX,"jdbc:oracle:thin:");
  System.out.println("newurl:"+myUrl);
  returnnewMyConnectionWrapper(driver.connect(myUrl,info));
  }
  publicDriverPropertyInfo[]getPropertyInfo(Stringurl,Propertiesinfo)
  throwsSQLException{
  returnDRIVER_PROPERTY_INFO;
  }
  publicbooleanjdbcCompliant(){
  returntrue;
  }
  publicbooleanacceptsURL(Stringurl)throwsSQLException{
  returnurl!=null&&url.startsWith(ACCEPTABLE_URL_PREFIX);
  }
  publicintgetMinorVersion(){
  return0;
  }
  publicintgetMajorVersion(){
  return1;
  }
  }

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

正在加载评论...