在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专家网 作者:戴羽 责编:豆豆技术应用