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