在Java/JDBC中透明处理“ORA-04068”错误
http://tech.ddvip.com 2008年05月08日 社区交流
内容摘要:在Oracle 里,如果你想编写存储过程你当然应该使用PL/SQL包。在这篇文章里,假设你一般了解PL/SQL 和非常熟悉PL/SQL 包。这篇文章关注于一个令人讨厌的错误,这个错误使许多使用PL/SQL以及使用API(例如JDBC)从应用层调用它的开发人员很苦恼。
让我们看看当我们执行这个程序并在另一个会话中编译这个包的时候发生了什么。与前面一样,我们执行这个程序并得到下面的输出:
M:articlesdbj2eearticles>java-cp"M:classes12.jar;.;M:learningjavadbj2ee
uildclasses"dbj2ee.article2.design2.ExecutePackageProcedureTwice
Executingthepackage...
Sleepingfor20seconds...
在另一个会话里,我们重新编译这个包:
SQL>@pkg_body
SQL>createorreplacepackagebodypkgas
2g_constantconstantnumber:=1;
3procedurep
4is
5begin
6insertintot(x)values(1);
7endp;
8endpkg;
9/
Packagebodycreated.
SQL>showerrors;
Noerrors.
SQL>
当我们回到我们的Java程序时,它输出下面的信息作为重新执行这个包的一部分:
M:articlesdbj2eearticles>java-cp"M:classes12.jar;.;M:learningjavadbj2ee
uildclasses"dbj2ee.article2.design2.ExecutePackageProcedureTwice
Executingthepackage...
Sleepingfor20seconds...
Outofsleep...
Executingthepackage...
ORA-04068detected-re-executingthepackage...
Executingthepackage...
如你所看到的,我们监测这个错误并成功地重新执行这个包。
尽管这个解决方法看起来很好,但是它的缺陷很明显:为了执行它,我们将在我们的Java程序中每次调用一个存储过程时都需要捕捉这个异常。这个更改在大多数系统中都是被禁止的。这个解决方法还有另一个缺陷,我将在后面提到,这个缺陷使这个解决方法不能用于许多系统。
来源:IT专家网 作者:戴羽 责编:豆豆技术应用